1

我想知道弱属性在 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)”。为什么??

4

1 回答 1

1

来自苹果:

弱 指定与目标对象存在弱(非拥有)关系。如果目标对象被释放,属性值会自动设置为 nil。

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

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

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

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

于 2012-10-09T13:21:49.953 回答