在ARC下,编译器将禁止使用 , , , 和 的任何-retainCount
方法-retain
或-dealloc
选择-release
器-autorelease
。
但有时我想知道运行时的保留计数,或者使用方法调配来交换-dealloc
NSObject 的方法来做某事。
是否可以抑制(或绕过)仅抱怨几行代码的编译器?我不想为整个项目或整个文件修改 ARC 环境。我认为预处理器可以做到这一点,但是怎么做呢?
补充:
谢谢大家给我上一课关于使用-retainCount
. 但我想知道是否可以强制调用/使用那些被禁止的方法/选择器。
我知道Instruments
这是完成这项工作的强大工具。但我仍然对这些问题感到好奇。
为什么我要使用-retainCount
:
使用块时,如果不指定__weak
外部变量的标识符,块复制到堆后,块会自动保留块中的那些外部对象。所以你需要使用弱自我来避免保留循环,例如:
__weak typeof(self) weakSelf = self;
self.completionBlock = ^{
[weakSelf doSomething];
};
但是,当您只在复制的块中使用实例变量时,它仍然会导致保留循环(是的,尽管您没有self
在块中使用任何关键字)。
例如,在非 ARC下:
// Current self's retain count is 1
NSLog(@"self retainCount: %d", [self retainCount]);
// Create a completion block
CompletionBlock completionBlock = ^{
// Using instance vaiable in the block will strongly retain the `self` object after copying this block into heap.
[_delegate doSomething];
};
// Current self's retain count is still 1
NSLog(@"self retainCount: %d", [self retainCount]);
// This will cuase retain cycle after copying the block.
self.completionBlock = completionBlock;
// Current self's retain count is 2 now.
NSLog(@"self retainCount: %d", [self retainCount]);
如果不使用-retainCount
之前/之后复制的块代码,我认为在完成块中使用实例变量引起的这个保留周期不会很容易被发现。
为什么我要使用-dealloc
:
我想知道我是否可以使用方法调配来监视哪个对象将在-dealloc
调用时通过在 Xcode 控制台上记录消息来释放。我想替换-dealloc
.NSObject