【Objective-C】なぜblock修飾子である(__block)を付けるのか【Objective-C】
こういう人に向けて発信しています。
・ブロック構文を理解してきた人
・__blockが読み取れない人
・Objective-C中級者
たとえばこういうコードです。
- (NSDictionary *)sessionSyncRequest:(NSString *)targetUrl
{
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
NSURL *url = [NSURL URLWithString:targetUrl];
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
__block NSDictionary *json = nil;
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration ephemeralSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration];
NSURLSessionDataTask *task = [session dataTaskWithRequest:urlRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSLog(@"did finish download.\n%@", response.URL);
if (error) {
NSLog(@"%@", error);
dispatch_semaphore_signal(semaphore);
return;
}
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
if (httpResponse.statusCode != 200) {
dispatch_semaphore_signal(semaphore);
return;
}
json = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
dispatch_semaphore_signal(semaphore);
}];
[task resume];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
return json;
}
参考
ブロック構文を使う場合に、ブロック外で定義された変数にblock修飾子をつけておくことによって、ブロック内で変更が可能になるらしい。(参照はblock修飾子が付いてなくても可能です。)
Objective-Cはけっこう奥が深いかも。。
なるほど。
だから、付けておくんですね。