【问题标题】:Objective-C, retaining a variable after NSLog-outputObjective-C,在 NSLog 输出后保留一个变量
【发布时间】:2012-10-09 12:18:14
【问题描述】:

我想知道弱属性在 Objective-C 中是如何工作的。 在此示例中,“myClass”中的弱属性“myString”的值仅在我使用 NSLog 打印时才保留。这是为什么呢?

#import <Foundation/Foundation.h>
#include <stdio.h>

@interface myClass : NSObject
@property (nonatomic, weak)NSString *myString;
- (void)readString;
@end

@implementation myClass
@synthesize myString;
- (void)readString
{
    const int MAXBUFFER = 80;
    char buffer[MAXBUFFER+1];
    NSLog(@"Input string:");
    fgets(buffer, MAXBUFFER, stdin);
    NSString *tempString = [[NSString alloc] initWithUTF8String:buffer];
    myString = tempString;
    NSLog(@"myString: %@", myString);  // Why does this line make all the difference?
}
@end

int main(int argc, const char * argv[])
{

    @autoreleasepool
    {
        myClass *myInstance = [[myClass alloc] init];
        [myInstance readString];
        NSLog(@"myInstance.myString: %@", myInstance.myString);
    }
    return 0;
}

如果 readString 方法中的 NSLog 行被注释掉,myInstance.myString 变为“(null)”。为什么??

【问题讨论】:

    标签: objective-c properties nsstring nslog weak-references


    【解决方案1】:

    来自苹果:

    weak 指定与 目标对象。如果目标对象被释放, 属性值自动设置为 nil。

    所以基本上当 arc 将代码插入 [readString] 时,他会这样做:

    NSString *tempString = [[NSString alloc] initWithUTF8String:buffer];
        myString = tempString;
    // + arc [tempString release]
    

    所以你的 tempString 不再存在于方法之外,因为没有任何东西保留它。

    但是当你使用 myString 在 [readString] 中添加 NSlog 时,NSLog 将保持对指针的引用(我不知道具体是怎么做的),但他实际上是这样做的,因为他记录了它们。

    【讨论】:

    • 如果我使用printf("myString: %s", [myString UTF8String]);,效果是一样的,所以NSLog没什么特别的。
    • 这与 NSLog 无关,但与 ARC YES。
    • 效果一样,因为 printf("myString: %s", [myString UTF8String]), 只要需要方法 [myString UTF8String] 的地址,arc 就会使指针处于活动状态。确切知道发生了什么的唯一方法是阅读从 asm 生成的代码。可以肯定的是,如果没有 printf 或 NSlog,arc 将在函数范围内消除指针。当您使用全局函数或全局引用(非弱)时,arc 不会在函数范围内消除指针。这就是为什么你仍然可以在方法调用之后立即拥有弱指针
    猜你喜欢
    • 2023-03-22
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多