> 
> My handler block refers to 'self' quite extensively - it calls other methods 
> of self and also refers to properties such as self.delegate. I'm not quite 
> sure how I can rework it not to refer to self. Maybe I just need to not use 
> the completion block approach and use a delegate callback instead. I need to 
> go away and think about this... thanks for the slap about the head.
> 
> --Graham
> 
> 

Having a handler block which refers to self is not in and of itself a problem, 
very many blocks implicitly do. The block retains self, however in most cases 
something else retains the block and the self reference goes away when the 
block is released. The problem usually comes when the handler block which 
refers to self is also a property of the object, eg myObj.completion = ^{ .. 
block referring to myobj }. Xcode normally warns you if you even get close to 
doing that however. 

If that's happening then allocations should show you are amassing whatever 
objects those are and never releasing them, does it? Or you can be old skool 
about it and NSLog() dealloc() to see if it's getting called.

Two ways around block retain cycles are 

1) If the block is a property of the object, eg a callback block, when you've 
called the block, nil the property, break the cycle. 
2) The strong/weak dance. You make a weak pointer to self which is actually 
captured in the block, then in the block you assign it to a strong pointer, 
then check for nil, then use that pointer. 

MyObj __weak *weakSelf = self;

^{ 
        MyObj *strongSelf = weakSelf;
        if( strongSelf )
        {
                // do work using strongSelf explicitly
        }
}



_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to