0

私は2つのクラスを持っています:

クラスA:

NSNotification名前付きのオブザーバーとして登録されましたnotificationName

.h ファイル宣言 -typedef void (^block1)(NSError *error);

プライベート インスタンス変数 -block1 _block1_obj;

次に、次のような 2 つの方法があります。

- (void) doSomethingWithCompletionHandler:(block1)handlerBlock
{
   _block1_obj = handlerBlock;    // Also tried _block1_obj = [handlerBlock copy];
   [classB_obj doAnotherThing];
}

- (void) notificationHandler:(NSNotification *)notification
{
   ...
   _block1_obj(error);
}

クラス B:

- (void) doAnotherThing
{
   ...
   [[NSNotificationCenter defaultCenter] postNotificationName:notificationName
                                                            object:nil
                                                          userInfo:dict];
}

_block1_objデバッグ中に、値が割り当てられていることがわかりまし たdoSomethingWithCompletionHandler

しかし、しばらくして制御が notificationHandler: に来ると _block1_objnil.

これがなぜなのかわかりません。誰でも説明できますか?

更新:copy属性を使用してプロパティを作成しようとしましたが、うまくいきませんでした。

4

2 に答える 2

0

ブロックをスタックからヒープにコピーする必要があります。コピーブロックを使用しない場合、それを宣言するには不十分ですが、コピーなしでivarを直接割り当てます。

于 2013-01-31T06:22:55.277 に答える
-1

インスタンス変数を として宣言する必要があるため、オブジェクトを保持する必要がある__strongことARCがわかります。

.mファイルで次のようなプライベート プロパティを使用することをお勧めします。

@interface YourClass ()

@property (strong, nonatomic) block1 block1_obj;

@end

@implementation YourClass

@end

次に、アクセサーを使用してブロックを割り当てます。

self.block1_obj = handlerBlock;
于 2013-01-30T13:03:31.660 に答える