1

我有一个为 ARC 和 iOS 5 设计的库,但一位客户想要为 iOS 4.x 构建。weak我将带有限定符的属性转换为unsafe_unretained,但是现在看来我遇到了内存损坏-esq 崩溃。在崩溃的情况下,我有一个像这样的委托属性

@property (unsafe_unretained) id<MYDelegateProtocol> delegate;

@synthesize是伊瓦尔。

每当我想在委托上调用方法时,我检查它是否是nil,如果不是,那么我调用该方法,因为我在该协议中没有可选方法,所以我不检查respondsToSelector.

但是,自从更改weakto 后unsafe_unretained,我发现引用显然消失了,我留下了一个悬空指针。如果我在 ObjC 异常上放置断点(对于无法识别的消息),然后po是对象的地址,我会看到它是一个甚至没有实现委托协议的对象,所以它当然会崩溃。

使用时unsafe_unretained如何知道引用已“消失”?我的代码依赖于之前被清零的指针。

4

3 回答 3

2

你有一个对象所有权问题。已释放的对象不会为零,它只会指向该对象曾经所在的地址。nil 指针将指向 0x0。您需要分析您的架构如何在被委托的记录处于活动状态时有一个正在释放的委托。在某些特殊情况下,被委托的对象可能会保留它们的委托(如 NSURLConnection)。在其他情况下,被委托的对象是其委托的属性,在这种情况下,需要在解除分配之前清除委托。分析您的模式和/或提供更多信息。

于 2012-09-25T18:04:07.057 回答
2

试试这个我开发的iOSWeakForwarder类

于 2014-03-27T17:54:06.750 回答
1

使用 unsafe_unretained 时,我如何知道引用已“消失”?我的代码依赖于之前被清零的指针。

这必须由您在编译时确定。通常,作为委托的对象应该在方法中设置delegate委托给它的对象的属性。例如:nildealloc

- (void)dealloc
{
    if (_httpRequest.delegate == self)
        _httpRequest.delegate = nil;
}

希望这可以帮助!

于 2012-09-25T18:03:34.683 回答