ブロックに関する調査を行っています。コードはこちら
typedef NSString* (^MyBlock)(void);
@property(copy,nonatomic) MyBlock block1;
表示中
self.block1 = ^{
self
NSLog(@"do block");
return @"a";
};
もちろん、自己は保持されます。
self.block = nil;
自己の保持回数を確認すると、1 減っていて、保持サイクルがないことがわかりました。
これは正しい状況だと思います。ブロックは自己を保持し、ブロックを解放すると自己が解放されます。保持カウントが減少しました。
私は少し変更を加えましたが、物事は奇妙です:ブロックをローカル変数にします。
表示中
MyBlock block1 = ^{
self
NSLog(@"do block");
return @"a";
};
[block copy]; // retain count of self gets added.
[block release]; // retain count of sell still the same
なぜ?Block_release() を試しましたが、同じです。NSArray のようなローカル変数をブロックに入れると、保持カウントは self と同じルールに従います。
@property の内部には何か違うものがあるに違いありません。以前にこれを調査した人はいますか? 助けてください。
さらに、私はARCでこれを行います。ローカル変数ブロックは保持サイクルを作成し、インスタンス変数は自動解放のために自己を保持し、数秒後に解放され、自己オブジェクトが正常に解放されます。
インスタンス変数とローカル変数がメモリ内の異なる部分に割り当てられているためですか?スタック?、[ブロックコピー]を行うと、両方ともヒープにコピーされますか?
EDIT : インスタンス変数とローカル変数ではありません。@property を使用すると違いますが、説明はありますか?