3

还有可能吗?我的意思是弱指针会自动为空。强指针只有在指向其他地方时才会释放。

我们还会有指向已释放对象的错误吗?

__unsafe_unretained 是由那些知道自己在做什么的人完成的。所以这并不是真正的错误。

4

2 回答 2

13

当心 __autoreleasing 与 @autoreleasepool。编译器不够聪明,无法在耗尽自动释放池时保留 __autoreleasing 变量的值。这包括带有 NSError** 参数的方法中的 @autoreleasepool。

当心 __block __autoreleasing 变量。这包括一个设置 NSError** 变量的块对象。一些基于块的 API 将块调用包装在自动释放池中,因此您最终会遇到与上述相同的缺陷。

请注意实际上是不安全未保留的 API。例如,AppKit 和 UIKit 中的许多委托指针都是不安全的未保留的,而不是零弱的。如果您不正确地安排您的对象图,那么当委托对象被解除分配并且工具包尝试使用它时,您将崩溃。

注意堆分配的 C 对象指针数组。可以正确执行此操作,但如果您不小心,则会出现泄漏或崩溃。

当心线程竞赛。如果你有一个多线程错误,那么所有的赌注都没有了。

于 2013-05-10T21:53:23.707 回答
4

__unsafe_unretained、CFTypeRefs、malloc()ed 内存

于 2013-05-10T02:26:24.723 回答