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

看板MacDev作者 (Loafer是了好)時間11年前 (2012/08/26 22:33), 編輯推噓3(3011)
留言14則, 3人參與, 最新討論串2/2 (看更多)
SWTest.h 多一個 method @interface SWTest : NSObject @property (strong) NSString *sStr1; @property (weak) NSString *wStr2; -(void) applicationTest1; -(void) applicationTest2; @end 把 SWTest.m 改成如下 -(void) applicationTest1{ self.sStr1 = [NSString stringWithFormat:@"test"]; // 不要直接用 @"test",這個物件的行為和一般行為不太一樣。 self.wStr2 = self.sStr1; self.sStr1 = nil; NSLog(@"%@ in Test1", self.sStr1); NSLog(@"%@ in Test1", self.wStr2); // 預期會出現null,但結果還是出現 test! } -(void) applicationTest2{ NSLog(@"%@ in Test2", self.sStr1); NSLog(@"%@ in Test2", self.wStr2); } 然後 main.m 改成如下 int main(int argc, const char * argv[]){ @autoreleasepool{ SWTest *swtest = [[SWTest alloc] init ]; @autoreleasepool { [swtest applicationTest1]; } [swtest applicationTest2]; } } 這樣一來在 applicationTest2 的 self.wStr2 就是 null 了 如果把 wStr2 改成 strong ,就不會出現 null 可以這樣解說 ivar 的 weak 是 ARC 自動加到 autorelease pool 而在 BBSealion 的例子中,只有一個 main() 裡的 autorelease pool 所以要自行加一個才會看到差異 那在寫 iOS的App 情況下呢? 是很容易遇到 autorelease pool 把裡面的物件清掉的情況 所以要認為被加到 autorelease pool 的物件在 method 結束就不能用了 這樣比較保險。 ※ 引述《BBSealion (海獅)》之銘言: : 最近剛開始學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: 219.85.196.183

08/27 09:34, , 1F
感謝! 這例子可以成功 不過是說沒有碰到autoreleasepool
08/27 09:34, 1F

08/27 09:35, , 2F
的狀況下 weak和strong就沒甚麼差嗎?
08/27 09:35, 2F

08/27 09:36, , 3F
另外是為什麼一定要用stringWithFormat啊?
08/27 09:36, 3F

08/27 09:37, , 4F
直接寫不是比較直觀的做法嗎? 但反而就讓w&s沒差了??
08/27 09:37, 4F

08/27 09:38, , 5F
目前我的認知 直接寫就=[NSString alloc]initWithString
08/27 09:38, 5F

08/27 09:58, , 6F
在寫一個iOS或是Mac程式的時候,碰到autorelease 機會很大
08/27 09:58, 6F

08/27 09:59, , 7F
或說上面的例全用 local variable 。就會看出來差別了
08/27 09:59, 7F

08/27 14:50, , 8F
關掉 ARC 把 @"test" 的retainCount 秀出來是一個很大的數
08/27 14:50, 8F

08/27 14:51, , 9F
alloc後retainCount 一開始要是 1,才會符合書上說的表現
08/27 14:51, 9F

08/28 09:43, , 10F
恩... 用local似乎可以理解。 retain值很大的設計好怪?
08/28 09:43, 10F

08/28 09:44, , 11F
初學還沒遇到實際狀況 不過觀念上大概懂了 感謝o大~
08/28 09:44, 11F

08/28 09:56, , 12F
因為@""的設計是一個const,但是它又是一個物件,一樣會
08/28 09:56, 12F

08/28 09:56, , 13F
有retain count,為了避免不小心把它release掉了,所以
08/28 09:56, 13F

08/28 09:57, , 14F
才會塞個很大的retain count進去
08/28 09:57, 14F
文章代碼(AID): #1GEZF35B (MacDev)
文章代碼(AID): #1GEZF35B (MacDev)