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.
On Dec 27, 2012, at 2:00 PM, [email protected] 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 protected])
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 [email protected]