On 4 Mar 2011, at 01:10, Matt Neuburg wrote:

> On Tue, 01 Mar 2011 16:15:09 +0700, "Gerriet M. Denkmann" 
> <gerr...@mdenkmann.de> said:
>> 
>> On 1 Mar 2011, at 15:53, Kyle Sluder wrote:
>> 
>>> On Tue, Mar 1, 2011 at 12:45 AM, Gerriet M. Denkmann
>>> <gerr...@mdenkmann.de> wrote:
>>>> So obviously NSAttributedString does NOT return [ [ aFont retain ] 
>>>> autorelease ] but just some internal pointer.
>>>> 
>>>> Is this documented somewhere?
>>> 
>>> In the Memory Management Programming Guide:
>>> http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/MemoryMgmt/Articles/mmAccessorMethods.html%23//apple_ref/doc/uid/TP40003539-SW6
>>> 
>>> --Kyle Sluder
>> 
>> As far as I can see, this article talks about different ways to implement 
>> setters and getters.
>> Do you want to imply that, whenever I get some object from AppKit, I have to 
>> retain it until I no longer need it?
>> 
>> Would be a safe thing to do. But also tedious. And in all my past experience 
>> this was never necessary. 
>> So I thought that the "Technique 1" of the linked article (returning 
>> [[someObject retain] autorelease]) was the standart practice employed by 
>> AppKit.
> 
> I've been thinking about this exchange, and I would propose that you consider 
> it like this:
> 
> Suppose you've got an NSArray and you fetch its element objectAtIndex:0. And 
> suppose you now let go of the array (release) and it is destroyed. Do you 
> expect the fetched element to persist without your having retained it? You do 
> not; you know darned well that a collection doesn't behave like that. The 
> collection *owns* its elements and will release them when it is released. All 
> you got when you called objectAtIndex:0 was a pointer. If you want a share in 
> its ownership, you must *take* ownership.
> 
> Here's another example. Suppose you've got a UIView and you ask for its 
> subviews. Do you imagine that asking for this property gives you ownership of 
> those subviews? You do not. Similarly for *any* property of *any* object. You 
> *never* imagine that a fetched property is somehow magically *giving* you 
> ownership; it's just showing you a value.
> 
> So what I'm trying to show you is that when you've got an object that owns 
> stuff, you *never* expect that that object will dispense the stuff it owns 
> while handing you a share in ownership. You *always* take ownership if you 
> want that stuff to persist beyond the object that dispenses them. Ownership 
> is *never* something you are magically given. It is always something that you 
> must take if you want it.

Yes, I fully agree.

But, taking my original example:

NSAttributedString * attributedString = ...
NSFont *aFont = [ attributedString attribute: NSFontAttributeName  atIndex: 0  
effectiveRange: NULL ];
NSString *fontName = [aFont fontName];
[ attributedString release ];

Now aFont no longer exists.
So fontName, being a property of the no longer existing aFont, should have 
vanished also, shouldn't it?

But in my case, fontName is still valid.
Maybe the fontName method really returns [[fontName retain]autorelease] (as I 
wrongly assumed all methods did) or some magical entity keeps a handle on all 
font names, or this name is a constant string decared in AppKit, or whatever.

But this did add to my confusion.

Kind regards,

Gerriet.

_______________________________________________

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:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

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

Reply via email to