在Objective C中使用弱引用时的BAD_ACCESS

时间:2017-12-12 11:26:14

标签: ios objective-c xcode delegates

我的应用内有问题。在类中,我声明了一个弱委托属性:

@interface FeedManager : NSObject

@property (nonatomic, assign) id<FeedDelegate> delegate;

...
@end

FeedDelegate定义方法-getViewController

在实现中,在给定的回调中,我试图调用委托:

@implementation FeedManager
   ...
   -(void) presentUpdates {
       if([self.delegate respondsToSelector:@selector(getViewController)]) {
           //Do stuff
       }
   }
   ...
}

我看到这导致if行中的运行时崩溃

  

崩溃:com.apple.main-thread

     

EXC_BAD_ACCESS KERN_INVALID_ADDRESS

所以我认为它试图访问已释放的委托,所以我添加了一个空检查以避免它

if(self.delegate &&[self.delegate respondsToSelector:@selector(getViewController)])

但它仍然因同样的错误而崩溃。如何避免运行时错误?

1 个答案:

答案 0 :(得分:1)

更改您的委托属性

@property (nonatomic, assign) id<FeedDelegate> delegate;

进入

@property (nonatomic, weak) id<FeedDelegate> delegate;

  

这指定当前类的对象具有可以是任何类型的委托。弱说明符对于委托对象是通用的,因为它意味着具有委托的对象不会增加委托的引用计数(在ARC中说“保留它的强引用”)。弱代表参考是标准做法。