MacDev 板


LINE

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
1F:推 BBSealion:感謝! 這例子可以成功 不過是說沒有碰到autoreleasepool 08/27 09:34
2F:→ BBSealion:的狀況下 weak和strong就沒甚麼差嗎? 08/27 09:35
3F:→ BBSealion:另外是為什麼一定要用stringWithFormat啊? 08/27 09:36
4F:→ BBSealion:直接寫不是比較直觀的做法嗎? 但反而就讓w&s沒差了?? 08/27 09:37
5F:→ BBSealion:目前我的認知 直接寫就=[NSString alloc]initWithString 08/27 09:38
6F:→ offname:在寫一個iOS或是Mac程式的時候,碰到autorelease 機會很大 08/27 09:58
7F:→ offname:或說上面的例全用 local variable 。就會看出來差別了 08/27 09:59
8F:→ offname:關掉 ARC 把 @"test" 的retainCount 秀出來是一個很大的數 08/27 14:50
9F:→ offname:alloc後retainCount 一開始要是 1,才會符合書上說的表現 08/27 14:51
10F:推 BBSealion:恩... 用local似乎可以理解。 retain值很大的設計好怪? 08/28 09:43
11F:→ BBSealion:初學還沒遇到實際狀況 不過觀念上大概懂了 感謝o大~ 08/28 09:44
12F:推 Blueshiva:因為@""的設計是一個const,但是它又是一個物件,一樣會 08/28 09:56
13F:→ Blueshiva:有retain count,為了避免不小心把它release掉了,所以 08/28 09:56
14F:→ Blueshiva:才會塞個很大的retain count進去 08/28 09:57







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Gossiping站內搜尋

TOP