-2

クラスAとクラスBの2つのクラスがあります。

ObjectA には ObjectB というプロパティがあります。さて、シナリオは――

  1. ObjectA call ObjectB method- [ObjectB methodB1].
  2. メソッド [ObjectB methodB1] を実行した後、objectB は objectA にコールバックを送信します。
  3. コールバック ObjectA を取得し、ObjectB を解放します。次の方法で行いました-

    [ObjectB リリース]; ObjectB = なし;

  4. ObjectB には別のメソッド ->methodB2 があり、objectA にコールバックを送信した直後に [ObjectB methodB2] の実行を開始し、実行中に ObjectA が ObjectB を解放したためにクラッシュし、その後 ObjectB にはオブジェクトがありません。

では、この問題を解決するにはどうすればよいでしょうか。

ご回答有難うございます。

4

4 に答える 4

2

[ObjectB methodB2] の実行直後にコールバックを ObjectA に移動します。または、2 つのコールバックを作成します。1 つは [ObjectB methodB1] の後で、もう 1 つは [ObjectB methodB2] の後で、2 番目のコールバックの後に ObjectB を解放します。

于 2013-07-30T12:44:35.107 に答える
0
ObjectB.ObjectA = nil;
[ObjectB release];
ObjectB = nil;
于 2013-07-30T13:42:02.647 に答える
0

ここに 2 つのシナリオがあります。

1) ObjectA によって 2 回呼び出されたときに、ObjectB に異なるプロパティが渡される可能性があります。

2) オブジェクト B には 1 つのプロパティ セットのみが渡され、オブジェクト A は Bethod B1 と B2 を実行する必要がありますが、オブジェクト B は同じプロパティを保持します。

3) オブジェクト B に新しいパラメーターを渡す必要がある場合は、ゲッターとセッターを使用しますか?

シナリオ 1:

ObjectA.m:

    ...
     ObjectB *objectB = [[ObjectB alloc] initWithSomeParameter:@"the parameter"];
     NSString *callback1 = [objectB methodB1];
    // why release when you can repoint?
     ObjectB *objectB = [[ObjectB alloc] initWithSomeParameter:@"another parameter"];
     NSString *callback2 = [objectB methodB2];
    [objectB release];

シナリオ 2:

ObjectA.m:

    ...
     ObjectB *objectB = [[ObjectB alloc] initWithSomeParameter:@"the parameter"];
     NSString *callback1 = [objectB methodB1];
     NSString *callback2 = [objectB methodB2];
    [objectB release];

シナリオ 3:

ObjectA.m:

    ...
     ObjectB *objectB = [[ObjectB alloc] initWithSomeParameter:@"the parameter"];
     NSString *callback1 = [objectB methodB1];
    [objectB setSomeParameter:@"another parameter"];
     NSString *callback2 = [objectB methodB2];
    [objectB release];

ObjectB がコールバックすると言うときは? 私はあなたが意味しないことを願っています:

ObjectA.m:

     ObjectB *objectB = [[ObjectB alloc] initWithSomeParameter:@"the parameter"];
     NSString *callback1 = [objectB methodB1];
     ...

ObjectB.m:

     ...
     //DO some work in method B1
     ObjectA *objectA [[ObjectA alloc] init];
     [objectA callback];

それはすぐそこに迫っているメモリリードです...これがあなたの言いたいことである場合は、上記のシナリオを読むか、クロスオブジェクト通知、つまりコールバックの NSNotificationCentre 通知を確認することをお勧めします。

于 2013-07-31T10:24:38.147 に答える
0

methodB1開始時に保持selfし、終了時に解放する必要があります。

于 2013-07-30T14:29:01.250 に答える