Hi,   Thanks for the replies. Things are a bit clearer now, that I
understand the synthesized getters are returning retained and auto-released
objects. However, the behavior doesn't seem to be entirely consistent. I
have marked in comments below what I would expect the retain count to be
            NSImage *img = [[NSImage alloc] init]; //retain count should be
1

Cell *cell = [[Cell alloc] init];

[cell setImage:img]; //retain count should be 1

NSImage *cellImage = [cell image]; //retain count 2

NSLog(@"Original image pointer: %x, retain count: %d", img, [img retainCount]);
//retain count 1

NSLog(@"cellImage pointer:%x, retain count: %d", cellImage, [cellImage
retainCount]); //retain count 2

NSLog(@"Cell image pointer: %x, retain count: %d", [cell image], [[cell
image] retainCount]); //retain count 4

NSLog(@"Cell image pointer: %x, retain count: %d", [cell image], [[cell
image] retainCount]); //retain count 6

NSLog(@"Draining pool");

[pool drain];

pool = nil;

pool = [[NSAutoreleasePool alloc] init];

NSLog(@"Cell image pointer: %x, retain count: %d", [cell image], [[cell
image] retainCount]); //retain count 3

NSLog(@"Cell image pointer: %x, retain count: %d", [cell image], [[cell
image] retainCount]); //retain count 5


Actual program output:

  2009-05-05 18:50:03.404 TestApp[2688:10b] Original image pointer: 112bd0,
retain count: 1

*  2009-05-05 18:50:03.422 TestApp[2688:10b] cellImage pointer:113410,
retain count: 2*

*  2009-05-05 18:50:03.427 TestApp[2688:10b] Cell image pointer: 113410,
retain count: 3*

*  2009-05-05 18:50:03.428 TestApp[2688:10b] Cell image pointer: 113410,
retain count: 5*

*  2009-05-05 18:50:03.428 TestApp[2688:10b] Draining pool*

*  2009-05-05 18:50:03.428 TestApp[2688:10b] cellImage pointer:113410,
retain count: 1*

*  2009-05-05 18:50:03.429 TestApp[2688:10b] Cell image pointer: 113410,
retain count: 2*

*  2009-05-05 18:50:03.429 TestApp[2688:10b] Cell image pointer: 113410,
retain count: 4*

If the getter is always incrementing the reference count by 1, I would
expect the reference count at each NSLog, where I am using the getter, to be
2 above the previous value. This doesn't seem to be the case for line 3 of
the output where it has gone up by only 1. In subsequent NSLog() statements
it seems to go up by 2.

This behavior is seen again after the drain. Am I missing something? Thanks

Regards

George M.P.



On Tue, May 5, 2009 at 11:40 AM, Ali Ozer <ao...@apple.com> wrote:

> There is no trouble. The getter (the -image call in your case) returns a
> retained/autoreleased result, which temporarily pushes up the reference
> count on each call.  If you were to ask for the retainCount later in the
> program, you should see that it has gone back to normal. Something like the
> following will demonstrate this:
>
> NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
> NSLog(@"Cell image pointer: %x, retain count: %d", [cell image], [[cell
> image] retainCount]);
> NSLog(@"Cell image pointer: %x, retain count: %d", [cell image], [[cell
> image] retainCount]);
> [pool drain];
> NSLog(@"Cell image pointer: %x, retain count: %d", [cell image], [[cell
> image] retainCount]);
>
> The -drain will eliminate those extra "references" (which are harmless of
> course).   No need to do this in your code, unless you need to use a local
> autorelease pool for another reason.
> Ali
>
>
>
> On May 4, 2009, at 21:34 PM, Malayil George wrote:
>
>
>  Hi,    I'm a little confused with retain counts and properties. I would
>> appreciate some help in understanding this. I have a class setup as
>> follows
>>
>> @interface Cell : NSObject {
>>
>> NSImage *image;
>>
>> }
>>
>>
>> @property (copy) NSImage *image;
>>
>>
>> @end
>>
>> Now, in my code, I do the following
>>
>> NSImage *img = [[NSImage alloc] init];
>>
>> Cell *cell = [[Cell alloc] init];
>>
>> [cell setImage:img];
>>
>> NSLog(@"Original image pointer: %x, retain count: %d", img,[img
>> retainCount
>> ]);
>>
>> NSLog(@"Cell image pointer: %x, retain count: %d", cell.image, [cell.image
>> retainCount]);
>>
>> NSLog(@"Cell image pointer: %x, retain count: %d", [cell image], [[cell
>> image] retainCount]);
>>
>> It looks like everytime I call [cell image] the retain count goes up. Why
>> would this be the case? It doesn't matter if I set the property to copy or
>> retain, I see the same results. Am I expected to do the following
>>
>> NSImage *img = [cell image];
>>
>> NSLog(@"Cell image pointer: %x, retain count: %d", [image retainCount]);
>>
>> I guess my question is do getters automatically increment the retain count
>> instead of my having to do [[cell image] retain]? Thanks
>>
>> Regards
>>
>> George M.P.
>> _______________________________________________
>>
>> 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/aozer%40apple.com
>>
>> This email sent to ao...@apple.com
>>
>>
>
>
_______________________________________________

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