Re: [問題] 有關property裡的strong & weak
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
08/27 09:34, 1F
→
08/27 09:35, , 2F
08/27 09:35, 2F
→
08/27 09:36, , 3F
08/27 09:36, 3F
→
08/27 09:37, , 4F
08/27 09:37, 4F
→
08/27 09:38, , 5F
08/27 09:38, 5F
→
08/27 09:58, , 6F
08/27 09:58, 6F
→
08/27 09:59, , 7F
08/27 09:59, 7F
→
08/27 14:50, , 8F
08/27 14:50, 8F
→
08/27 14:51, , 9F
08/27 14:51, 9F
推
08/28 09:43, , 10F
08/28 09:43, 10F
→
08/28 09:44, , 11F
08/28 09:44, 11F
推
08/28 09:56, , 12F
08/28 09:56, 12F
→
08/28 09:56, , 13F
08/28 09:56, 13F
→
08/28 09:57, , 14F
08/28 09:57, 14F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):