1

クラスAがあり、クラスBIがクラスAからクラスBを呼び出しています。ここで私の問題は、クラスAの幅と高さがクラスBに依存していることです。sizeForScrollViewプロパティ(クラスBプロパティ)が変更されたとき、通知が必要です。クラスBの通知ラインからクラッシュしているときに、クラスAをリロードしています。

コードは次のとおりです。

クラス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];

助けてください。ありがとうございます。

4

2 に答える 2

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
}

オブジェクトをオブザーバーとして追加しても保持カウントが増加しないため、これが必要です。通知センターは、オブザーバーの所有権を取得したり、オブザーバーがまだ存在しているかどうかを追跡したりしません。

于 2013-08-30T07:34:14.187 に答える
0

viewDidUnload の「MyNotification」のオブザーバーを削除します

 [[NSNotificationCenter defaultCenter] removeObserver:self name:@"MyNotification" object:nil];
于 2013-08-30T09:11:03.993 に答える