调用通知时BAD_ACCESS

时间:2013-08-30 04:31:53

标签: ios objective-c notifications exc-bad-access

我有类A和类BI从类A调用类B.这是我的问题是类A的宽度和高度取决于类B.当sizeForScrollView属性(类B属性)改变时我想要通知。一切都运行正常。但是当我正在重新加载A类时,它正从B类通知线崩溃。

以下是代码:

A类

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector (changeContentSize) name:@"MyNotification" object:nil];
-(void)changeContentSize{
    self.scrollView.contentSize = CGSizeMake(self.aSubjectView.sizeForScrollView.width, self.aSubjectView.sizeForScrollView.height);
    self.aSubjectView.frame = CGRectMake(frameForView.origin.x, frameForView.origin.y, frameForView.size.width, self.aSubjectView.sizeForScrollView.height);

}

B类

CGRect rect;
rect.size.width = self.frame.size.width;
rect.size.height = heightForSubject + 10;
rect.origin = self.frame.origin;
sizeForScrollView = rect.size;
NSNotification* notification = [NSNotification notificationWithName:@"MyNotification" object:self];
        [[NSNotificationCenter defaultCenter] postNotification:notification];

请帮助我。谢谢你。

2 个答案:

答案 0 :(得分:2)

确保A类的实例在dealloc上作为观察者自行删除。否则,如果您释放实例,通知中心在发布后仍会尝试与之通话,从而导致EXC_BAD_ACCESS崩溃。

如果您不使用ARC,那么看起来就像这样(在A类中):

- (void)dealloc 
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [super dealloc]; // Take this line out if you are using ARC
}

这是必要的,因为将对象添加为观察者不会增加其保留计数。通知中心不接受观察者的所有权或做任何事情来追踪它是否仍然存在。

答案 1 :(得分:0)

在viewDidUnload

中删除“MyNotification”的观察者
 [[NSNotificationCenter defaultCenter] removeObserver:self name:@"MyNotification" object:nil];