2011-12-14 8 views
2

ブロックを呼び出す前/呼び出し後、retaincountは常に1です。 apple block docから、自己が保持する必要があることがわかります。なぜ誰かが知ることができますか?ブロック内に自己保持されますか?

NSLog(@"Before block retain count: %d", [self retainCount]);  
void (^block)(void) = ^(void){ 
    UIImage* img = [UIImage imageNamed:@"hometown.png"]; 
    [self setImage:img]; 
    NSLog(@"After block retain count: %d", [self retainCount]); 
}; 
block(); 

答えて

5

まず、のretainCountは無駄です。それを呼び出さないでください。

ブロックは、ブロックのコピー時にキャプチャされたオブジェクトのみを保持します。したがって、selfはその例ではブロックに保持されません。

+0

文書ではちょうど言った: 参照カウント環境では、ブロック内のObjective-Cオブジェクトを参照するとき、デフォルトでは保持されます。これは、単にオブジェクトのインスタンス変数を参照したとしても当てはまります。ただし、__blockストレージタイプ修飾子でマークされたオブジェクト変数は保持されません。 アップルの医者は本当に私をたくさん混乱させました。ありがとうございました。 – joshualmf

+0

ドキュメントにバグを登録してください。私は同意する - それは完全にはっきりしていない。 retain *は、ブロックがコピーされ、インスタンス変数を取り囲む言語が少しだけオフになっている場合にのみ発生することがより明白であるべきです。 – bbum

0

私はいくつかの研究を行いました。第1に、私はブロック1で@propertyを使用しませんでした。つまり、設定すると何もコピーされないので、それらは保持されません。第2に、[ブロックコピー]を実行すると変数は保持されますブロックはスタックアドレスを指し、ヒープにコピーして安全にします。

変数 'array'はメンバ変数であるため、保持されません。また、ブロック内に置かれているかどうかにかかわらず、変数はローカル変数です。保持されます。 (これは私がまだabtを混乱させたもので、なぜメンバー変数が保持されないのか、代わりに自己が保持カウント?plsに答えて返されます)。

ブロックを使用した後、 nil self.block = nil;変数を解放させ、保持サイクルを回避する。

PS。サイクルを壊す方法はuse __block id weakSelf = self;ブロック内では、__block変数も保持されません。

関連する問題