作者offname (Loafer是了好)
看板MacDev
标题Re: [问题] 有关property里的strong & weak
时间Sun Aug 26 22:33:35 2012
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