On Jan 29, 2013, at 10:51 PM, Ken Thomases <[email protected]> wrote:

> I disagree.  I think Bob's construction is valid, if unconventional.  It is 
> also valid-though-unconventional to release an object that you've +alloc'd 
> but not -init'd at the caller side.
> 
> SomeClass* foo = [SomeClass alloc];
> if (someCondition)
> {
>       [foo release];
>       return;
> }
> foo = [foo init];
> 
> Bob's construction is just as valid as the above because it's essentially 
> doing the same thing.
> 
> You're right to argue that, in practical terms, some classes may have 
> -dealloc implementations that fail in these circumstances, but then those 
> -dealloc implementations are buggy.

While that may be true, those dealloc methods, which you may not have control 
over, are still going to be there, and can potentially be a problem. Heck, 
without access to the source code, we can't even be sure that the framework 
classes won't have this problem. Releasing an object without init'ing it first 
is unusual enough that it's not inconceivable that people could fail to be 
aware of this possibility.

This is especially true for classes that use KVC, since there's no obvious way 
to ask the system whether you're already registered as an observer for 
something or not (other than setting a flag in your object when you add the 
observer), and -removeObserver:forKeyPath:context: will throw an exception if 
you call it when you're not already an observer.

It may look ugly, but I'd still call [super init] before releasing self, just 
for safety's sake.

Charles

_______________________________________________

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]

Reply via email to