Re: Dumb ARC question
Re: Dumb ARC question
- Subject: Re: Dumb ARC question
- From: Rick Mann <email@hidden>
- Date: Thu, 27 Dec 2012 22:37:05 -0800
On Dec 27, 2012, at 21:58 , Rick Aurbach <email@hidden> wrote:
> Rick,
>
> I'm no Obj-C language expert; in fact I'm pretty much a newbie. But I have had some experience with smart pointers (boost, etc) from my C++ case.
>
> Here's how I think of strong and weak references in ARC. (If the following is wrong, I'm sure someone more knowledgeable than myself will set us both straight.)
>
> Weak references never increment the retain count.
>
> They are simply pointers which are automatically nil-ed when the object's retain count reaches 0 (and is hence deallocated). So, in your method, you create an object with [NSMutableData data] and assign it to a weak pointer. It's retain count is 1. At the end of the method, this object has its retain count decremented. Since its count is now 0, it is deallocated and the weak reference to it is set to 0.
>
> In your case, this is confusing because you've combined two statements into one. The logic of your line of code is really
> id temp = [NSMutableData data];
> mInputBuffer = temp;
>
> In this formulation, it is clear that the temp is deallocated when the method exits. Combining these two statement in a way that hides the temporary does not automagically promote the weak pointer to being a strong one.
>
> Hope this helps.
Not really. I may not have been clear. This is in an Objective-C object, just compiled in a .mm file so I can call some other C++ code. But the object in question, and the ivar mInputBuffer, are all Obj-C.
So, the usual bit about references being weak by default in C structs (and C++ classes) doesn't hold here.
>
>
> On Dec 27, 2012, at 2:00 PM, email@hidden wrote:
>
>> I just wrote some Objective-C++ code. It's basically just a regular Obj-C class, but makes some C++-style calls in its methods.
>>
>> Anyway, I added an NSMutableData* ivar to my class, and set it with
>>
>> mInputBuffer = [NSMutableData data];
>>
>> in one of the methods. Subsequent accesses, however, have resulted in it being deallocated, even though I never set mInputBuffer to NULL anywhere.
>>
>> I changed the code to refer to it via a strong property, and it's fine.
>>
>> I thought ARC worked the same in both cases (that is, retained the object on assignment and kept it around until the last reference was gone, even if via a regular ivar)
>>
>> A bit of googling confirms this, so I'm wondering what I've done wrong.
>>
>> --
>> Rick
>
> Cheers,
>
> Rick Aurbach, Ph.D.
>
>
>
>
>
>
> _______________________________________________
>
> Cocoa-dev mailing list (email@hidden)
>
> 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:
>
> This email sent to email@hidden
--
Rick
_______________________________________________
Cocoa-dev mailing list (email@hidden)
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:
This email sent to email@hidden