【发布时间】:2012-01-11 23:39:18
【问题描述】:
我对自动引用计数 (ARC) 中的 autoreleasepool 存有疑问
在我的示例(粘贴在下面)中,我有一个 autoreleasepool,并且在 autoreleasepool 块中没有语句。在 autoreleasepool 块之后有一个 autoreleased 实例 (a3)。
预期行为:
我预计以下语句会导致内存泄漏,因为它没有封装在自动释放池中。
A* a3 = b1.xa1;
实际行为:
实际行为是在运行时没有抛出内存泄漏错误
注意:
如果在a3初始化后移动了autoreleasepool,那么在运行时会抛出内存泄漏错误
我的理解:
只有在 autoreleasepool 中的语句才会具有 autorelease pool 的效果,但根据我的示例,情况似乎并非如此。
问题:
- 发生这种情况的原因是什么?
- 是否有任何意义 用自动释放池块封闭语句?还是很好 足以在之前有一个空的 autoreleasepool 块 自动发布的实例?如果是,为什么?
我的问题总结
问题更多是关于在 autoreleasepool 中包含语句似乎与在 autoreleasepool 之后放置语句具有相同的效果,即使它在 autoreleasepool 之外
代码:
#import<Foundation/Foundation.h>
@interface A : NSObject
- (void) dealloc;
@end
@implementation A
- (void) dealloc { printf("instance of A deallocated = %p\n", self); };
@end
@interface B : NSObject
@property (weak) A* xa1;
- (void) dealloc;
@end
@implementation B
@synthesize xa1;
- (void) dealloc { printf("instance of B deallocated = %p\n", self); };
@end
int main()
{
system("clear");
B* b1 = [[B alloc] init];
A* a1 = [[A alloc] init];
A* a2 = [[A alloc] init];
b1.xa1 = a1;
@autoreleasepool
{}
A* a3 = b1.xa1; //I expected this to throw a memory leak error, but it doesn't
//Note - b1.xa1 returns an autoreleased instance
printf("--- end of main\n");
return(0);
}
【问题讨论】:
-
什么是“内存泄漏错误”?您看到的文字是什么,在什么背景下?
-
下面贴出内存泄漏错误(当autoreleasepool a3初始化移到autoreleasepool之前):
objc[2668]: Object 0x105313b90 of class A autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
标签: objective-c automatic-ref-counting autorelease