This is a new compiler warning that only showed up when I updated XCode to 4.6. My code is lifted directly from Apple's documentation (this is my iOS 6 code btw).
GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
localPlayer.authenticateHandler = ^(UIViewController *viewController, NSError *error) {
[self setLastError:error];
if(localPlayer.authenticated){
Warning--Capturing 'localPlayer' strongly in this block is likely to lead to a retain cycle
The issue is that the localPlayer object is keeping a strong reference to itself - when localPlayer is "captured" for use within the authenticateHandler block, it is retained (when objective-c objects are referred to within a block, the compiler under ARC calls retain for you). Now, even when all other references to the localPlayer cease to exist, it will still have a retain count of 1 and hence the memory will never be freed. This is why the compiler is giving you a warning.
Refer to it with a weak reference, like:
GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
__weak GKLocalPlayer *blockLocalPlayer = localPlayer;
localPlayer.authenticateHandler = ^(UIViewController *viewController, NSError *error) {
[self setLastError:error];
if (blockLocalPlayer.authenticated) {
...
Given that the lifetime of the authenticateHandler and the localPlayer are tightly linked (i.e. when the localPlayer is deallocated, so is the authenticateHandler) there's no need for it to maintain a strong reference within the authenticateHandler. Using Xcode 4.6, this no longer generates the warning you mentioned.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With