看板 MacDev 關於我們 聯絡資訊
最近剛開始學Obj-C 爬了一下文&精華區好像都沒看到有討論? 但這問題困擾我好久...一直搞不清楚strong和weak的性質 期望有高手能解惑一下 (能有實例更好QQ) 目前看到解釋是,拿weak指標去指物件 (一個被其他strong指標指著的物件) 如果指住這物件的其他strong指標都移走的話,這個weak指標也會釋放掉那個物件 所以我嘗試做一個簡單例子如下: (但沒有效果,應該是我理解錯誤orz) SWTest.h @interface SWTest:NSObject @property (strong) NSString *sStr1; @property (weak) NSString *wStr2; -(void) applicaionTest; @end SWTest.m #import "SWTest.h" @implemetation SWTest @synthesize sStr1, wStr2; -(void) applicationTest{ self.sStr1 = @"test!"; self.wStr2 = self.sStr1; self.sStr1 = nil; NSLog(@"%@", self.wStr2); // 預期會出現null,但結果還是出現 test! } @end main.m int main(int argc, const char * argv[]){ @autoreleasepool{ SWTest *swtest = [[SWTest alloc] init ]; [swtest applicationTest]; } } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.25.17.148 ※ 編輯: BBSealion 來自: 114.25.17.148 (08/26 11:07)
RiddleApple:self.sStr1 = @"test!" 會產生一個字串常數, 08/26 16:00
RiddleApple:這個字串常數應該會到程式結束時才會被釋放掉。 08/26 16:01
RiddleApple:你可以把 self.sStr1 = @"test!" 這行改成: 08/26 16:22
RiddleApple:self.str1=[[NSString alloc]initWithFormat:@"test"] 08/26 16:23
RiddleApple:更正:是self.sStr1 08/26 16:24
RiddleApple:不過改成這樣依然會印出test 08/26 16:25
RiddleApple:,因為這個方式產生出來的字串物件retainCount會加2 08/26 16:27
BBSealion:有耶 我試過用init的方法 他還會警告這樣多此一舉 08/26 20:57
BBSealion:然後依然看不出strong和weak的差別 08/26 20:57
BBSealion:所以怎樣才能造出 看出兩者差別的例子呢? 08/26 20:57