[問題] 有關property裡的strong & weak

看板MacDev作者 (海獅)時間11年前 (2012/08/26 11:06), 編輯推噓1(109)
留言10則, 2人參與, 最新討論串1/2 (看更多)
最近剛開始學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)

08/26 16:00, , 1F
self.sStr1 = @"test!" 會產生一個字串常數,
08/26 16:00, 1F

08/26 16:01, , 2F
這個字串常數應該會到程式結束時才會被釋放掉。
08/26 16:01, 2F

08/26 16:22, , 3F
你可以把 self.sStr1 = @"test!" 這行改成:
08/26 16:22, 3F

08/26 16:23, , 4F
self.str1=[[NSString alloc]initWithFormat:@"test"]
08/26 16:23, 4F

08/26 16:24, , 5F
更正:是self.sStr1
08/26 16:24, 5F

08/26 16:25, , 6F
不過改成這樣依然會印出test
08/26 16:25, 6F

08/26 16:27, , 7F
,因為這個方式產生出來的字串物件retainCount會加2
08/26 16:27, 7F

08/26 20:57, , 8F
有耶 我試過用init的方法 他還會警告這樣多此一舉
08/26 20:57, 8F

08/26 20:57, , 9F
然後依然看不出strong和weak的差別
08/26 20:57, 9F

08/26 20:57, , 10F
所以怎樣才能造出 看出兩者差別的例子呢?
08/26 20:57, 10F
文章代碼(AID): #1GEPB5Kw (MacDev)
文章代碼(AID): #1GEPB5Kw (MacDev)