On Jan 29, 2013, at 3:22 AM, Quincey Morris wrote:

> On Jan 29, 2013, at 00:51 , Bob Cromwell <bob.cromwell2...@gmail.com> wrote:
> 
>> if below code valid ?   All sample codes I could find invoke "self = [super 
>> init]" first and then check the input parameter inside "if (self)" block.  
>> 
>> @implementaion Bla
>> 
>> - (id)initWithFoo:(NSString *)foo
>> {
>>   if (foo == nil) {
>>       return nil;
>>   }
>>   self = [super init];
>>   if (self) {
>>       _foo = foo;
>>       .....
>>   }
>>   return self;
>> }
>> 
>> I had thought there would be memory leak.   "Bla * b =  [Bla alloc ] 
>> initWithFoo:nil];" .  However under ARC using Instruments Leaks, there are 
>> no leak found. 
> 
> No, it's not valid. You can see why if you rewrite this using manual 
> retain/release conventions:
> 
>   if (foo == nil) {
>       [self release];
>       return nil;
>   }
>   self = [super init];
> 
> You must (and ARC does) release 'self' before returning nil, to avoid a 
> memory leak. The problem is that releasing 'self' will invoke 'dealloc', and 
> you have no idea whether it's safe to invoke 'dealloc' if you haven't invoked 
> done '[super init]' yet.

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.

Regards,
Ken


_______________________________________________

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

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

Reply via email to