Objective c 从弱到不安全的转换\u未修复导致崩溃?

Objective c 从弱到不安全的转换\u未修复导致崩溃?,objective-c,automatic-ref-counting,Objective C,Automatic Ref Counting,我有一个专为ARC和iOS 5设计的库,但一位客户希望为iOS 4.x构建库。我使用弱限定符将属性转换为不安全_unrepaired,但现在似乎遇到了内存损坏esq崩溃。 在崩溃的情况下,我有这样一个委托属性 @property (unsafe_unretained) id<MYDelegateProtocol> delegate; @property(不安全\未维护)id委托; 我合成了ivar 每当我想对委托调用一个方法时,我检查它是否为nil,如果不是,我就调用该方法,因为

我有一个专为ARC和iOS 5设计的库,但一位客户希望为iOS 4.x构建库。我使用
限定符将属性转换为
不安全_unrepaired
,但现在似乎遇到了内存损坏esq崩溃。 在崩溃的情况下,我有这样一个委托属性

@property (unsafe_unretained) id<MYDelegateProtocol> delegate;
@property(不安全\未维护)id委托;
我合成了ivar

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

但是,自从将
更改为
不安全_unrepaired
后,我发现引用显然消失了,剩下的是一个悬空指针。如果我在ObjC异常上设置一个断点(用于无法识别的消息),然后
po
对象的地址,我发现它是一个甚至没有实现委托协议的对象,因此它当然会崩溃

使用
unsafe\u unretained
时,我如何知道引用已“消失”?我的代码依赖于指针之前被调零

当使用不安全的未恢复时,我如何知道引用已恢复 “走了”?我的代码依赖于指针之前被调零

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

- (void)dealloc
{
    if (_httpRequest.delegate == self)
        _httpRequest.delegate = nil;
}
希望这有帮助

当使用不安全的未恢复时,我如何知道引用已恢复 “走了”?我的代码依赖于指针之前被调零

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

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

希望这有帮助

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

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

试试我开发的这个类

试试我开发的这个类

如果你想查看它何时发布,你必须使用弱。如果你想查看它何时发布,你必须使用弱。今天晚些时候我将尝试这种方法,并让你知道它是如何发布的goes@yano这对你的孩子有帮助吗问题?今天晚些时候我将尝试这种方法,并让您知道它是如何实现的goes@yano这样做有助于解决你的问题吗?