On Jan 22, 2013, at 1:28 PM, Andy Lee <ag...@mac.com> wrote:

> On Jan 22, 2013, at 2:19 PM, Charles Srstka <cocoa...@charlessoft.com> wrote:
> 
>> On Jan 22, 2013, at 12:58 PM, Andy Lee <ag...@mac.com> wrote:
>> 
>>> // Or this also works (protocol).
>>> @protocol AvoidCompilerWarning
>>> - (id)initWithArg:(id)arg;
>>> @end
>> 
>> Really, a protocol is what you ought to be doing. Make a protocol with 
>> -initWithManager: in it, and then make all the classes that might get passed 
>> to this method comply with your protocol. Then, do this:
>> 
>> if ([myClass conformsToProtocol:@protocol(MyProtocol)])
>>      myObj = [[myClass alloc] initWithManager:sel]];
>> else
>>      myObj = [[myClass alloc] init];
>> 
>> The advantage to this method is a simple one: Suppose some random class 
>> happens to implement a method named -initWithManager:, but that method has 
>> nothing to do with your -initWithManager: other than a coincidental title, 
>> and takes a completely different type of object. Your original code will 
>> result in unpredictable behavior in this case (and probably throw an 
>> exception leading to a crash). If you use a protocol, you'll know not just 
>> that the method responds to something named -initWithManager:, but that it's 
>> *your* -initWithManager:
> 
> Makes sense, especially since it sounds like you have enough control of the 
> class to declare it as conforming to the protocol.
> 
> To be extra fail-safe, you might want to perform a cast to be sure the right 
> initWithManager: gets called:
> 
> if ([myClass conformsToProtocol:@protocol(MyProtocol)])
>       myObj = [(id <MyProtocol>)[myClass alloc] initWithManager:self];
> else
>       myObj = [[myClass alloc] init];
> 
> --Andy

That's a good fix. In addition to being more fail-safe, that also lets clang 
and Xcode know exactly what you intend here, so that if you decide someday to 
do something like rename the initWithManager: method using Xcode's Refactor 
feature, it should get this invocation of the method as well.

Charles

_______________________________________________

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