1

例:

typedef void(^ responseBlock)(NSDictionary *、NSError *);
@interface MyClass:NSObject
{{
    [??] responseBlock responseHandler;
}

[??]括弧にはどの修飾子を入れる必要がありますか?

プロパティとしてのブロックはコピー修飾子を使用して設定する必要があることを読みました...しかし、この場合、ブロックをプロパティとして公開する必要はありません。単にivarのままにしておきたいのですが、コピーを指定するにはどうすればよいですか?また、何も指定せずに、使用されるデフォルトの修飾子は何ですか?他のすべての場合と同じように__強いですか?

iOS5でARCを使用しています。

4

1 に答える 1

5

はい、ブロックは ObjC のオブジェクトであるため__strong、適切な修飾子です。これがデフォルトであるため、実際にはオフのままにしておくことができます。

プロパティなしで代入時にブロックをコピーするように指定する方法はありません。これはユーザーの責任になります ( responseHandler = [someBlock copy];)。.m ファイルにクラス拡張子を追加することで、このクラス自体にのみ表示される (他のコードでは使用できない) プロパティを宣言できます。

@interface MyClass ()
@property (copy) responseBlock responseHandler;
@end

これにより (合成時に) 通常のアクセサー メソッドが提供され、使用時にコピーが処理されます。

また、ブロック内でインスタンス変数を宣言することが可能であることに注意してください (現在は推奨される手順です)。@implementationこれをプライベート属性 (プロパティ アクセスなし) にしたいようで、そこで宣言された ivar は他のコードからは見えません。(もちろん、プロパティを使用している場合はこれを行う必要はありません@synthesize。ivar が作成されます。)

@implementation MyClass
{
    responseBlock responseHandler;
}

// Continue with implementation as usual
于 2012-04-12T17:26:37.480 に答える