这是一个新的编译器警告,只有出现了,当我Xcode更新到4.6。 我的代码是直接从苹果公司的文件解除(这是我的iOS 6的代码BTW)。
GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
localPlayer.authenticateHandler = ^(UIViewController *viewController, NSError *error) {
[self setLastError:error];
if(localPlayer.authenticated){
警告-捕获“localPlayer”强烈该块很可能会导致保留周期
的问题是,localPlayer对象被保持的强引用本身 - 当localPlayer被“俘获”在authenticateHandler块内使用时,它被保持(当目标c对象块内参照,根据ARC的呼叫编译器保留为了你)。 现在,即使在localPlayer所有其他引用不复存在,它仍然具有1的保留计数,因此内存将永远不会被释放。 这就是为什么编译器给你一个警告。
是指它与弱引用,如:
GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
__weak GKLocalPlayer *blockLocalPlayer = localPlayer;
localPlayer.authenticateHandler = ^(UIViewController *viewController, NSError *error) {
[self setLastError:error];
if (blockLocalPlayer.authenticated) {
...
鉴于authenticateHandler和localPlayer的寿命是紧密相连(即当localPlayer被释放,所以是authenticateHandler)有没有必要为它保持authenticateHandler内很强的借鉴意义。 使用的Xcode 4.6,这不再产生你提到的警告。
编译器只是帮助你解决代码已经是一个问题,它只是以前不知道这件事情。
:您可以了解这里保留周期http://www.cocoawithlove.com/2009/07/rules-to-avoid-retain-cycles.html
基本上你只需要更改您的代码是这样的:
GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
__weak MyViewController *blockSelf = self;
localPlayer.authenticateHandler = ^(UIViewController *viewController, NSError *error) {
[blockSelf setLastError:error];
if(localPlayer.authenticated){