__strong 在 Objective C 中的用法示例
Example of __strong usage in Objective C
我正在阅读有关 __strong 参考和 __weak 参考用法的信息:Explanation of strong and weak storage in iOS5
我试着写了一些代码来展示这些知识。但是,__strong 并没有在对象被释放时将其保存在内存中。
我第一次这样做:
Parent * fumu = [[Parent alloc] init];
[fumu release];
一切正常。调用父对象 init,释放时调用 dealloc。
第二次我这样做了:
Parent * fumu = [[Parent alloc] init];
[fumu retain];
[fumu release];
调用了父对象初始化方法。但是没有调用 dealloc,因为 fumu 引用的 Parent 对象仍然保留计数为 1。符合预期。
使用 __strong
如前所述:
**Strong: "keep this in the heap until I don't point to it anymore"
Weak: "keep this as long as someone else points to it strongly"**
现在假设我使用 __strong 关键字。如果我像下面这样添加另一个强引用,Parent 对象不应该调用 dealloc,因为我们仍然有对它的强引用 (anotherFumu)。但是,当我 运行 它时,会调用 dealloc。我没有看到强引用有任何影响。
Parent * __strong fumu = [[Parent alloc] init];
Parent * __strong anotherFumu = fumu;
[fumu release]; //Parent object dealloc gets called
请指教。谢谢
结果:
我打开了 ARC,并简单地使用 nil 将强指针指向远离 Parent 对象,因此能够正确地看到 __strong 和 __weak 的行为,如下所示:
Parent * fumu = [[Parent alloc] init];
__strong Parent * strongFumu = fumu;
__weak Parent * weakFumu = fumu;
fumu = nil; //your auto variables window should show that both trongFumu and weakFumu are still valid with an address
NSLog(@"weakFumu should be valid here, because strongFumu is still pointing to the object");
strongFumu = nil; //when strongFumu points away to nil, weakPtr will then also change to nil
NSLog(@"weakFumu should be nil here");
alloc
是 allocate 的缩写,所以当你调用
Parent * fumu = [[Parent alloc] init];
你分配对象,所以它的保留计数是 =1 然后你调用 [fumu retain];
您的对象保留计数高达 +2
然后当你打电话给 [fumu release];
它添加 -1 所以你的最终计数将是 +1 所以这是正确的。
Strong 和 Weak 是 ARC 类型,您不能在非 ARC 项目中使用它们。它与 properties/variables 一起使用...当您需要拥有该对象时,您可能希望使用 strong
,在您的示例中创建对象时,您已经是 "owning" 对象。 ..
我正在阅读有关 __strong 参考和 __weak 参考用法的信息:Explanation of strong and weak storage in iOS5
我试着写了一些代码来展示这些知识。但是,__strong 并没有在对象被释放时将其保存在内存中。 我第一次这样做:
Parent * fumu = [[Parent alloc] init];
[fumu release];
一切正常。调用父对象 init,释放时调用 dealloc。
第二次我这样做了:
Parent * fumu = [[Parent alloc] init];
[fumu retain];
[fumu release];
调用了父对象初始化方法。但是没有调用 dealloc,因为 fumu 引用的 Parent 对象仍然保留计数为 1。符合预期。
使用 __strong如前所述:
**Strong: "keep this in the heap until I don't point to it anymore" Weak: "keep this as long as someone else points to it strongly"**
现在假设我使用 __strong 关键字。如果我像下面这样添加另一个强引用,Parent 对象不应该调用 dealloc,因为我们仍然有对它的强引用 (anotherFumu)。但是,当我 运行 它时,会调用 dealloc。我没有看到强引用有任何影响。
Parent * __strong fumu = [[Parent alloc] init];
Parent * __strong anotherFumu = fumu;
[fumu release]; //Parent object dealloc gets called
请指教。谢谢
结果:
我打开了 ARC,并简单地使用 nil 将强指针指向远离 Parent 对象,因此能够正确地看到 __strong 和 __weak 的行为,如下所示:
Parent * fumu = [[Parent alloc] init];
__strong Parent * strongFumu = fumu;
__weak Parent * weakFumu = fumu;
fumu = nil; //your auto variables window should show that both trongFumu and weakFumu are still valid with an address
NSLog(@"weakFumu should be valid here, because strongFumu is still pointing to the object");
strongFumu = nil; //when strongFumu points away to nil, weakPtr will then also change to nil
NSLog(@"weakFumu should be nil here");
alloc
是 allocate 的缩写,所以当你调用
Parent * fumu = [[Parent alloc] init];
你分配对象,所以它的保留计数是 =1 然后你调用 [fumu retain];
您的对象保留计数高达 +2
然后当你打电话给 [fumu release];
它添加 -1 所以你的最终计数将是 +1 所以这是正确的。
Strong 和 Weak 是 ARC 类型,您不能在非 ARC 项目中使用它们。它与 properties/variables 一起使用...当您需要拥有该对象时,您可能希望使用 strong
,在您的示例中创建对象时,您已经是 "owning" 对象。 ..