Objective c 目标-C,在NSLog输出后保留一个变量

Objective c 目标-C,在NSLog输出后保留一个变量,objective-c,properties,nsstring,nslog,weak-references,Objective C,Properties,Nsstring,Nslog,Weak References,我想知道弱属性在Objective-C中是如何工作的。 在本例中,“myClass”中的弱属性“myString”的值仅在我使用NSLog打印它时保留。为什么呢 #import <Foundation/Foundation.h> #include <stdio.h> @interface myClass : NSObject @property (nonatomic, weak)NSString *myString; - (void)readString; @end

我想知道弱属性在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;
}
#导入
#包括
@接口myClass:NSObject
@属性(非原子,弱)NSString*myString;
-(void)readString;
@结束
@myClass的实现
@合成myString;
-(void)读取字符串
{
常量int MAXBUFFER=80;
字符缓冲区[MAXBUFFER+1];
NSLog(@“输入字符串:”);
fgets(缓冲区、最大缓冲区、标准输入);
NSString*tempString=[[NSString alloc]initWithUTF8String:buffer];
myString=tempString;
NSLog(@“myString:%@”,myString);//为什么这一行有这么大的区别?
}
@结束
int main(int argc,const char*argv[]
{
@自动释放池
{
myClass*myInstance=[[myClass alloc]init];
[myInstance readString];
NSLog(@“myInstance.myString:%@”,myInstance.myString);
}
返回0;
}
如果readString方法中的NSLog行被注释掉,myInstance.myString将变为“(null)”。为什么??

来自苹果:

弱指定与对象存在弱(非拥有)关系 目标对象。如果目标对象已解除分配,则 属性值将自动设置为零

因此,基本上,当arc在[readString]中插入代码时,他会:

NSString *tempString = [[NSString alloc] initWithUTF8String:buffer];
    myString = tempString;
// + arc [tempString release]
因此,tempString不再存在于方法之外,因为没有任何内容保留它

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

来自苹果:

弱指定与对象存在弱(非拥有)关系 目标对象。如果目标对象已解除分配,则 属性值将自动设置为零

因此,基本上,当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是。这是相同的效果,因为printf(“myString:%s”,“myString UTF8String]),只要需要方法[myString UTF8String]的地址,ARC就会使指针保持活动状态。要确切知道发生了什么,唯一的方法是读取asm生成的代码。可以肯定的是,如果没有printf或NSlog,arc将在函数的作用域内nihil指针。当您使用全局函数或全局引用(非弱)时,arc不会将指针置于函数范围内。这就是为什么在方法调用之后仍然可以使用弱指针的原因如果我使用
printf(“myString:%s”,[myString UTF8String]),效果也是一样的所以NSLog没有什么特别之处。NSLog没有什么特别之处,但是ARC是。这是相同的效果,因为printf(“myString:%s”,“myString UTF8String]),只要需要方法[myString UTF8String]的地址,ARC就会使指针保持活动状态。要确切知道发生了什么,唯一的方法是读取asm生成的代码。可以肯定的是,如果没有printf或NSlog,arc将在函数的作用域内nihil指针。当您使用全局函数或全局引用(非弱)时,arc不会将指针置于函数范围内。这就是为什么在方法调用之后仍然可以使用弱指针