2011-11-29 52 views
3

我的项目使用ARC。我用下面的代码进行测试:__在Xcode 4.2中的ARC和autorelease池

NSString __weak *string; 
@autoreleasepool { 
     string = [NSString stringWithString:@"AAA"]; 
} 

NSLog(@"string: %@", string); 

我认为它输出:

string: (null) 

但它实际上输出:

string: AAA 

我不明白。 __weak有什么影响?

编辑:

而下面这段代码:

NSString __weak *string; 
NSString __strong *str; 
@autoreleasepool { 
    str = [NSString stringWithFormat:@"%@", @"AAA" ]; 
    string = str; 
} 

NSLog(@"string: %@", string); 

它还输出:

string: AAA 

回答

8
NSString __weak *string; 
@autoreleasepool { 
     string = [NSString stringWithFormat:@"%@", @"AAA"]; 
} 

NSLog(@"string: %@", string); 

它输出为你想要的下面。

string: (null) 

因此,

string = [NSString stringWithString:@"AAA"]; 

是相同

string = @"AAA"; 

恒定字符串文字未在堆上分配。

EDITED:

str变量具有用于自动释放的对象仍强引用。

下面的代码就是你想要的。

NSString __weak *string; 
{ 
    NSString __strong *str; 
    @autoreleasepool { 
     str = [NSString stringWithFormat:@"%@", @"AAA" ]; 
     string = str; 
    } 
} 
NSLog(@"string: %@", string); 

而且

NSString __weak *string; 
@autoreleasepool { 
    NSString __strong *str; 
    str = [NSString stringWithFormat:@"%@", @"AAA" ]; 
    string = str; 
} 
NSLog(@"string: %@", string); 
+0

你的解释是完美的。但我在编辑中还有一个问题。请解释我! –

+0

好的,我已经更新了它。 –

+0

非常感谢! –