单例 iOS 中 removeFromSuperview 上的 EXC_BAD_ACCESS

Posted

技术标签:

【中文标题】单例 iOS 中 removeFromSuperview 上的 EXC_BAD_ACCESS【英文标题】:EXC_BAD_ACCESS on removeFromSuperview within singleton iOS 【发布时间】:2014-06-30 19:33:17 【问题描述】:

我有一个继承 NSObject 的单例。它引用了作为子视图添加到根视图控制器的 IntroView(UIView 的子类)。当在视图上单击某个按钮时,它会调用单例中的一个方法,该方法将视图从其父视图中删除。我每次都得到一个 EXC_BAD_ACCESS 代码=2。我不知道为什么,我尝试使用僵尸并检查引用是否为零。我试过保留它,一切(这一切都使用ARC)。下面是一些sn-ps的代码:

//the property in the Manager.h file
@property (nonatomic, retain) IntroView *introView;

//Code called when that button is clicked and view is supposed to be removed
- (void)setOption:(NSString *)chosenOption 
    self.chosenOption = chosenOption;
    if (!!self.introView) 
        [self.introView removeFromSuperview]; //THIS LINE


//creates the singleton
+ (instancetype)manager 
    static Manager *manager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^
        manager = [[self alloc] init];
    );
    return manager;

感谢任何和所有想法!

我想通了。有一个引用循环最终导致应用程序崩溃。

【问题讨论】:

if (!!self.introView) 应该做什么? 该!!是将对象更改为 BOOL 值的常用习语 如何添加 IntroView?崩溃时堆栈跟踪是什么样的? 以前从未见过。无论如何,这里应该使用哪个布尔值,真还是假? self.introView 属性是否包含对要删除的视图的引用,并且 IntroView 是 UIView 的子类吗?如果把retain属性改成weak呢? 哇.. 看看堆栈,这行代码似乎运行了 50 次......我刚刚查看了从 IntroView(UIView 的子类)调用该方法的方法) 并且它只被调用一次.. 不太确定这是怎么发生的。这可能与 Manager 是单身人士有关吗? 【参考方案1】:

有一个参考循环。我有一个函数:

- (UIView *)introView

一遍又一遍地引用自己。

【讨论】:

以上是关于单例 iOS 中 removeFromSuperview 上的 EXC_BAD_ACCESS的主要内容,如果未能解决你的问题,请参考以下文章

iOS多线程中的单例

iOS开发-单例模式

iOS中的单例

iOS – 单例模式写一次就够了

iOS单例详解

iOS基础之单例传值