2011-11-29 39 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

非常感謝! –