4

私はObjective-Cでブロックを使用していますが、ブロックをインスタンス変数に代入する場合は、ブロックをcopyにしなければならない理由を説明していませんassign?例えばなぜobjcブロックの割り当ては 'copy'でなく 'assign'でなければならないのですか?

:まあ

typedef void (^MyBlock)(); 

@interface SomeClass : NSObject 
{ 
    MyBlock myblock; 
    // Other ivars 
} 

@property (nonatomic, copy) MyBlock myblock; // Why must this be 'copy'??? 

// other declarations 

@end 

答えて

9

、のは、これを分析してみましょう:

は、いくつかの変数に割り当て、あなたはいくつかの方法の内のブロックを作成するとしましょう:

MyBlock block = ^{}; 

その後、 assignのプロパティに割り当てただけです。

self.myblock = block; 

含まれるメソッドが返されると、block変数は範囲外になり、割り当てが解除されます。したがって、これを念頭に置いてブロックオブジェクトcopyを作成し、それをインスタンス変数に格納する必要があります。そうすれば、オブジェクトを含むオブジェクトの存続期間中にブロックを所有することができます。

+8

I.e.ブロックは速度のためにスタック上に作成され、-copyはスタックからヒープに移動します。 – bbum

4

blocks are weirdです。

+1

+1ココア・ラヴ・アロイ –

+2

時には、高速で奇妙なことが必要です。 – bbum

0

wwdcのビデオでは、「高度な目的-cとガーベジコレクション」という価値の高い説明があります。他にも素晴らしい話がいくつかあります。強くお勧めします。

関連する問題