ブロックをコピーするタイミング ドキュメントによると、ブロックは「実行が定義されているスコープから戻ると削除されます。つまり、関数から直接ブロックを返すことはできません。ブロックを定義しているスコープがまだコールスタックにある間にのみブロックを使用できた場合、それらは実際ほど有用ではないでしょう。」
したがって、viewDidLoadで実行が完了するとブロックが削除されることを期待して、私が試したコードは次のとおりです。
MyReaderController.h
@interface MyReaderController : UIViewController
{
myBlockVar aBlockVar;
}
-(myBlockVar) getABlock;
@end
MyReaderController.m
@implementation MyReaderController
- (void)viewDidLoad
{
[super viewDidLoad];
aBlockVar=[self getABlock];
NSLog(@"Block Result = %f",aBlockVar(1));
}
-(void) viewDidDisappear:(BOOL)animated{
[super viewDidDisappear:animated];
NSLog(@"Block Exists even after the execution completes=%@ %f",aBlockVar,aBlockVar(5));
}
-(myBlockVar) getABlock{
return ^(int var){return 4.0f;};
}
@end
したがって、このコードでは、viewDidLoad を以下のコードのように変更する必要がありますか? そうでない場合は、いつ使用する必要がありますか?
- (void) viewDidLoad{
[super viewDidLoad];
aBlockVar=Block_copy([self getABlock]);
NSLog(@"Block Result = %f",aBlockVar(1));
}
パート2
後で、この次のコードを試してみましたが、viewDidDisappear で aBlockVar が nil obj として返されることを期待しています。
- (void)viewDidLoad
{
[super viewDidLoad];
Blocker *blocker=[[Blocker alloc] init];
myBlockVar myVar=[blocker getABlock];
aBlockVar=myVar;
NSLog(@"Block Result = %f",aBlockVar(1));
blocker=nil;
myVar=nil;
}
ブロッカー.m
#import "Blocker.h"
@implementation Blocker
-(myBlockVar) getABlock{
return ^(int var){return 4.0f;};
}
@end