2014-06-29 25 views
0

指派屬性發生什麼事,我宣佈在頭文件中的兩個屬性: @property(strong)NSString *p1; @property(assign)NSString *p4; 現在執行的文件,我寫兩個方法來測試指派屬性:在iOS上

- (void)testAssign { 
    NSString *rawString = @"Hello, "; 
    NSString *resultString = [rawString stringByAppendingString:@"World"]; 
    self.p4 = resultString; 
    resultString = nil; 
    (@"My group is %@", self.p4); 

} 

在此場景將是一個錯誤。

但是當如下面的代碼,這樣做的很好:

- (void)testString { 
    NSString *rawString = @"Hello, "; 
    NSString *resultString = [rawString stringByAppendingString:@"World"]; 
    self.p4 = resultString; 
    self.p1 = resultString; 
    NSLog(@"now result is %@, %@", self.p4, self.p1); 
    resultString = nil; 
    NSLog(@"now result is %@, %@", self.p4, self.p1); 
    self.p1 = nil; 
    NSLog(@"now result is %@, %@", self.p4, self.p1); 
} 

結果是:

2014-06-29 19:10:55.798 TestDemo[20853:303] now result is Hello, World, Hello, World 
2014-06-29 19:10:55.798 TestDemo[20853:303] now result is Hello, World, Hello, World 
2014-06-29 19:10:55.799 TestDemo[20853:303] now result is Hello, World, (null) 

第二片段發生什麼事?爲什麼沒有錯誤?

+0

您正在收到什麼錯誤? –

+1

他說他的第一個代碼片段導致錯誤。那我問 –

+0

@阿尼爾,對不起,我沒有注意到。我會刪除我以前的評論。 – FreeNickname

回答

2

由於使用assign屬性並釋放指向的對象,您會在第一個片段中收到訪問衝突。

即使它應該有相同的問題,你不會在第二個代碼片段中找到一個 - 局部變量引用和強屬性引用都會被刪除,這會導致無效指針。

我懷疑這只是與編譯器優化和計時有關。如果我在調試器中單步執行,那麼這兩個代碼段都可以正常工作,這表明單步過程也在改變着事情。

在你正在尋找最終的崩潰,如果你繼續訪問P4,我證實了通過調用你的代碼在我的應用程序委託,didFinishLaunching然後從willResignActive訪問self.p4第二種情況。啓用殭屍使得它更清晰 - 「消息發送到釋放實例」在這兩種情況下。

根據ARC weak是首選,因爲這將替換爲'nil'的無效引用 - 您仍然有一個錯誤,但不會崩潰。

另請參閱 - Objective-C ARC: strong vs retain and weak vs assign

+0

感謝您的回覆。如果我在第一個片段的NSLog上有一個斷點,沒有崩潰,會發生什麼?你說當我執行第二個片段,然後調用'self.p4'沒有崩潰。我會檢查你的鏈接 – maple