Objective-C,在NSLog输出后保留变量

时间:2012-10-09 12:18:15

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

我想知道Objective-C中的弱属性是如何工作的。 在这个例子中,弱属性" myString"的值。 in" myClass"只有当我用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-method中的NSLog-line被注释掉,myInstance.myString变为&#34;(null)&#34;。为什么?

1 个答案:

答案 0 :(得分:1)

来自Apple:

  

weak指定与...的弱(非拥有)关系   目标对象。如果目标对象已取消分配,则   属性值自动设置为nil。

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

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

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

但是当你使用myString在[readString]中添加NSlog时,NSLog将继续引用指针(我不确切知道如何),但实际上他确实记录了它们。