单例 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的主要内容,如果未能解决你的问题,请参考以下文章