2014-05-21 77 views
-1
NSString *strongObj = [[NSString alloc] init]; //alloc and initialze a new instance 
strongObj = @"some value"; //set value to a instance 
__weak NSString *weakObj = strongObj; //refer strong pointer to weak obj 

strongObj = nil; //set strong object to nil and remove it from memory 

strongObj = @"some value 2"; //assign a different value to strong obj 

weakObj ; // weak obj still holds // @"some value" // this value event i've set the week obj pointer to nil 

請看上面的代碼和評論,評論是我的觀點/假設。請澄清。iOS澄清中的強弱屬性

感謝

+0

弱對象將保留值直到其生命期和範圍在那裏。在範圍({和})之後,它將被自動發佈,並將添加到本地或最近的autoreleasepool。那麼它將被釋放/釋放。 –

+0

數以千計的騙局可能是:[Objective-C ARC:strong vs retain and weak vs assign](http://stackoverflow.com/questions/8927727/objective-c-arc-strong-vs-retain-and-weak -VS-分配) –

回答

0

雖然你正在創建一個strongObj實例,你實際上沒有使用相同的實例,但重新分配的指針字符串字面@"some value",不管地址是。它絕不是您在代碼的第一行分配的同一個實例。

現在,當您指定weakObj時,您實際上將它指向相同的字符串文字@"some value"

基本上發生的是weakObj沒有跟在strongObj之後,但是它跟在字符串字面上,它沒有被解除分配。這就是爲什麼你仍然看到「某個值」,而strongObj已被設置爲nil

0

字符串字面總是活着,並在運行時永遠不會被釋放。當指向的內存被釋放時,弱指針被取消,所以你錯誤地期望你的weakObj被取消。

要使其工作,而不是文字串,你應該使用

[[NSString alloc] initWithFormat:@"some value %d", 1]; 

即G。

NSString *strongObj = [[NSString alloc] initWithFormat:@"some value %d", 1]; //alloc and initialze a new instance 
__weak NSString *weakObj = strongObj; //refer strong pointer to weak obj 

strongObj = nil; //set strong object to nil and remove it from memory 

weakObj ;