在 ARC 中标记一个对象为非自动释放
Mark an object un-AutoRelease in ARC
众所周知,当没有变量引用对象时,ARC 中的对象不会立即释放。例如,
NSObject* obj = [[NSObject alloc] init];
obj = nil;
obj 将在一段时间后释放。(自动释放池排空)。
现在,我想要 obj dealloc 在它被设置为 nil 之后立即释放,这意味着 obj 不在自动释放池中。但是所有其他的obj应该和以前一样运行良好,这意味着程序仍然处于ARC模式。
有没有办法,也许是宏或编译器标志,来做到这一点?
首先:你不应该关心提前释放。这是一种强烈的代码味道。
第二:您真的非常确定吗,因为 -init
不会 将对象放入 ARP。也许表达式会导致保留自动释放组合,但在发布模式下编译应该优化它。
但是,如果它在 ARP 中,您可以像 Hermann Klecker 提到的那样关闭 ARP,或者——我认为这样更好——找到在 ARP 中成为该对象的原因。没有那个必要。
: 对象不在自动释放池中。 alloc
,它创建了对象,没有使用池。另一方面,你是对的:ARC 可能不会立即释放对象。
确实有一个注释可以用来强制释放:objc_precise_lifetime
。将其添加到变量声明将导致 ARC 在对象在当前范围内不再有效时立即发送 release
。
不过,阿明也说得对,这不太可能是你想要的。 ARC 知道它在做什么——当你使用这个注释时它无法进行优化——除非你也知道它在做什么,否则你应该强烈考虑让它完成它的工作。
众所周知,当没有变量引用对象时,ARC 中的对象不会立即释放。例如,
NSObject* obj = [[NSObject alloc] init];
obj = nil;
obj 将在一段时间后释放。(自动释放池排空)。
现在,我想要 obj dealloc 在它被设置为 nil 之后立即释放,这意味着 obj 不在自动释放池中。但是所有其他的obj应该和以前一样运行良好,这意味着程序仍然处于ARC模式。
有没有办法,也许是宏或编译器标志,来做到这一点?
首先:你不应该关心提前释放。这是一种强烈的代码味道。
第二:您真的非常确定吗,因为 -init
不会 将对象放入 ARP。也许表达式会导致保留自动释放组合,但在发布模式下编译应该优化它。
但是,如果它在 ARP 中,您可以像 Hermann Klecker 提到的那样关闭 ARP,或者——我认为这样更好——找到在 ARP 中成为该对象的原因。没有那个必要。
alloc
,它创建了对象,没有使用池。另一方面,你是对的:ARC 可能不会立即释放对象。
确实有一个注释可以用来强制释放:objc_precise_lifetime
。将其添加到变量声明将导致 ARC 在对象在当前范围内不再有效时立即发送 release
。
不过,阿明也说得对,这不太可能是你想要的。 ARC 知道它在做什么——当你使用这个注释时它无法进行优化——除非你也知道它在做什么,否则你应该强烈考虑让它完成它的工作。