On Aug 8, 2012, at 16:21 , Graham Cox <graham....@bigpond.com> wrote:

> This opens up a whole big can of worms about implementing copy.
> 
> If a superclass implements copies using NSCopyObject, then any pointer ivars 
> we add in a subclass need to be additionally -retained. But if the superclass 
> implements copy by alloc/initing a new object and setting properties, then 
> this extra step would lead to an over-retain and so leak.
> 
> But how can we know what approach the superclass has taken? It's not 
> documented and we don't have the source. Aren't we supposed to be immune from 
> implementation details like this? Or is it just a case of after a while the 
> experienced Cocoaista "just knows" what to do in each case? This is only just 
> rearing its head for me after almost 10 years...

It seems to me that you need to think of 'copyWithZone:' as a kind of 'init…' 
method, and it should therefore *not* use properties to change the instance 
variables that belong to the subclass, but change them directly. This is 
actually documented:

        
https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSCopying_Protocol/Reference/Reference.html

> "Your options for implementing this protocol are as follows:
> […]
>       • Implement NSCopying by invoking the superclass’s copyWithZone: when 
> NSCopying behavior is inherited. If the superclass implementation might use 
> the NSCopyObject function, make explicit assignments to pointer instance 
> variables for retained objects."

In other words, after calling 'super copyWithZone:', you should immediately fix 
(zero or overwrite) or retain your instance variables, if they're strong.

That doesn't work with ARC, of course. But this is also addressed in 
documentation:

        
http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

> "What do I have to do when subclassing NSCell or another class that uses 
> NSCopyObject?
> 
> Nothing special. ARC takes care of cases where you had to previously add 
> extra retains explicitly. With ARC, all copy methods should just copy over 
> the instance variables."


_______________________________________________

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