0

私はdispatch_asyncメソッドを使用してメインキューのタスクを実行しています。しかし、それはサイクルを維持する原因:dispatch_asyncネストされたブロック

に続いて、コードスニペットです:

self.test = ^{ 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      NSLog(@"%@", self); 
     }); 
    }; 

は、私はサイクルを維持し作成された理由を適切に取得することはできませんよ。私のコントローラはdispatch_asyncブロックの所有権を持っていません。

+1

プロパティ 'test'はクロージャを保持し、クロージャーには' self'への参照が含まれています。参照自体はブロック内にあります。 – Paulw11

答えて

1

weakSelfを使用してみてください:

__weak typeof(self) weakSelf = self; 

self.test = ^{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     NSLog(@"%@", weakSelf); 
    }); 
}; 
+0

しかし、 'self'は外側ブロックの実行彼が望むものではないかもしれない内部ブロックの(非同期の)実行と – newacct

0

あなたはこのような何か多分、外側のブロックはselfを保持したいのですが、内側のブロックが一度派遣生きselfを維持することができるようにしたくない場合は、次の

typeof(self) __weak weakSelf = self; 
self.test = ^{ 
    typeof(self) strongSelf = weakSelf; 
    if (strongSelf) { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      NSLog(@"%@", strongSelf); 
     }); 
    } 
}; 
関連する問題