【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はけっこう奥が深いかも。。

なるほど。
だから、付けておくんですね。



いいなと思ったら応援しよう!