3

この Apple リファレンスには、objective-c のブロック オブジェクトの概念的な概要があります。

http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Blocks/Blocks.pdf

しかし、それは私に関係があり、他の人に関係する可能性のある 2 つのトピックを実際には説明していません。最初の質問は次のようなものです: ブロック参照に nil を代入できますか? または、NULL を使用する必要がありますか? または、どちらも使用できませんか?

2 番目の問題は、メモリ管理の領域にあります。たとえば、スタック上にブロック オブジェクトを作成するメソッドを宣言しました。

-(void)makeTheClass
{
    TheClass *object = [[TheClass alloc] init];

    object.blockReference = ^(void) { return nil; } 
}

このオブジェクトは、あるスコープ内で作成され、スコープ外に出ると破棄されます。しかし、TheClass オブジェクトは実際には、この (ほとんど破棄された) ブロックへの参照を格納しようとしています。

typedef id (^WeirdBlockType)(void);

@interface TheClass {
    WeirdBlockType blockReference;   
}

このようなブロックのクラス プロパティを宣言するにはどうすればよいですか? これら2つの違いは何ですか:

@property (nonatomic, retain) WeirdBlockType blockReference;
@property (nonatomic, copy)   WeirdBlockType blockReference; 

?

Apple のドキュメントでは、ブロック コピーはブロックをヒープに移動すると明確に述べられています。しかし、そのままにしておくとどうなるでしょうか。makeTheClassメソッドのスコープ外に出た後、破棄されますか?

4

2 に答える 2

2

さて、私は解決策を見つけました。答えてくれた Gojan に感謝しますが、彼は実際には 1 つの場所で間違っていました。

ウェバは正しかった。ブロックの保持は、ヒープに完全に移動されるまで効果がなく、Block_copyそのようなタスクを達成するだけです。

おそらく、スタック上にある間に保持できないオブジェクトはブロックだけではありません。ただし、デフォルトでヒープ上にサブクラス インスタンスを作成 (allocおよびinit)している間は、気にする必要はありません。通常どおりに動作します。ブロック オブジェクトはデフォルトでスタック上に作成されるため、動作が少し予想外になります。NSObjectretain

みんなありがとう!

于 2010-11-14T10:27:25.620 に答える
0

ブロック参照に nil を割り当てることはできますか? または、NULL を使用する必要がありますか?

nil は「空の型」として読み取ることができid、 NULL は のように定義されます((void *)0)。ここでの違いはコンテキストです。NSObject ベースのオブジェクトを使用している場合は、nil を使用する必要があります。

ブロックの場合は nil を使用する必要があります。ブロックが NSObject であるかのように操作できるためです (ブロックを保持したり、解放したりできます)。ただし、NULL を使用すると機能するはずです。

このようなブロックのクラス プロパティを宣言するにはどうすればよいですか? これら2つの違いは何ですか:

@property (nonatomic, retain) WeirdBlockType blockReference;
@property (nonatomic, copy)   WeirdBlockType blockReference; 

?

ドキュメントには次のように書かれています:

Objective-C を使用している場合は、ブロック コピー、保持、および解放 (および自動解放) メッセージを送信できます。

したがって、両方の宣言は有効ですが、私に尋ねるとretaincopy.

結論は:

ブロックは、同時に定義およびインスタンス化されるオブジェクトのように扱われるため (実行時)、永続的な参照を取得した後は、その参照を他のオブジェクトと同様に考えることができます。

于 2010-11-13T13:32:55.907 に答える