我在一个班级里得到了这段代码:
- (void)cancel {
if (_cancelBlock)
_cancelBlock();
}
- (void)overrideCancelWithBlock:(void(^)(void))cancelBlock {
[_cancelBlock release];
NSLog(@"AsyncOperation-overrideCancelWithBlock-[cancelBlock retainCount]=%lu (before)", [cancelBlock retainCount]);
_cancelBlock = [[cancelBlock copy] retain];
NSLog(@"AsyncOperation-overrideCancelWithBlock-[_cancelBlock retainCount]=%lu (after)", [_cancelBlock retainCount]);
}
- (void)dealloc
{
NSLog(@"AsyncOperation-dealloc-[_cancelBlock retainCount]=%lu (before)", [_cancelBlock retainCount]);
[_cancelBlock release];
NSLog(@"AsyncOperation-dealloc-[_cancelBlock retainCount]=%lu (after)", [_cancelBlock retainCount]);
[super dealloc];
}这个NSLog()的输出是:
AsyncOperation-overrideCancelWithBlock-[cancelBlock retainCount]=1 (before)
AsyncOperation-overrideCancelWithBlock-[_cancelBlock retainCount]=1 (after)
AsyncOperation-dealloc-[_cancelBlock retainCount]=1 (before)
AsyncOperation-dealloc-[_cancelBlock retainCount]=1 (after) copy方法的文档如下:
特殊考虑 如果您使用的是托管内存(而不是垃圾收集),则此方法在返回新对象之前保留它。然而,该方法的调用方负责释放返回的对象。
所以。NSLog()的输出始终显示retainCount的相同值的方式
发布于 2011-03-08 14:03:31
文档 for retainCount说:
重要的:这种方法在调试内存管理问题上通常没有任何价值。由于任何数量的框架对象都可能保留了一个对象以保存对它的引用,同时自动释放池可能在对象上保存了任意数量的延迟版本,因此很难从该方法中获得有用的信息。 要了解您必须遵守的内存管理的基本规则,请阅读“内存管理规则”。若要诊断内存管理问题,请使用适当的工具: LLVM/Clang静态分析器通常可以在运行程序之前发现内存管理问题。 仪器应用程序中的对象分配工具(见“仪器用户指南”)可以跟踪对象的分配和销毁。 Shark (参见Shark用户指南)还描述了内存分配(以及程序的许多其他方面)。
回答你的问题:只有苹果可能知道为什么retainCount在这一点上是这样的。
发布于 2011-03-08 17:27:33
_cancelBlock = [[cancelBlock copy] retain];这样就保留了这个块,只需-copy它。
由于块可以根据所采取的操作在运行时更改表单,并根据实现细节在编译时更改类型,因此各个块类通常将retainCount视为无意义的生成器。在某些情况下,这意味着总是返回1。
请注意,在所有情况下,零的retainCount都是逻辑上不可能的。
https://stackoverflow.com/questions/5233143
复制相似问题