我想知道弱属性在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)"。 为什么??
来自苹果:
弱指定与 存在弱(非拥有)关系 目标对象。如果目标对象已解除分配,则 属性值自动设置为 NIL。
所以基本上当 arc 将代码插入 [readString] 时,他会:
NSString *tempString = [[NSString alloc] initWithUTF8String:buffer];
myString = tempString;
// + arc [tempString release]
因此,您的 tempString 不再存在于方法之外,因为没有任何东西保留它。
但是当你用myString在[readString]中添加NSlog时,NSLog会保留对指针的引用(我不知道具体怎么做),但他实际上这样做了,因为他记录了它们。