On Dec 4, 2012, at 10:44 PM, Gerriet M. Denkmann <gerr...@mdenkmann.de> wrote: > On 5 Dec 2012, at 12:59, Greg Parker <gpar...@apple.com> wrote: >> On Dec 4, 2012, at 8:56 PM, Gerriet M. Denkmann <gerr...@mdenkmann.de> wrote: >>> I have (using Arc) a method which works fine: >>> NSString *explanation; >>> [ self doSomeThingAndExplain: &explanation ]; >>> >>> Now I decided that sometimes I don't need this explanation. So I changed it >>> to: >>> >>> NSString **explanatioP = urgent ? NULL : &explanation; // <-- "no explicit >>> ownership... >>> [ self doSomeThingAndExplain: explanatioP]; // passing address of >>> non-local object... >>> >>> But now the compiler gets really upset (errors written as comments above). >>> >>> What Arc-magic is needed to get this to compile? >> >> You need to add explicit ownership to your ** declarations. ARC needs to >> know whether explanationP points to to a strong variable or a weak variable >> or an autoreleasing variable. >> >> This is one way: >> -(void) doSomethingAndExplain:(__strong NSString **)explanationP; >> >> __strong NSString **explanationP = urgent ? NULL : &explanation; >> [self doSomethingAndExplain:explanationP]; >> >> This is another way: >> -(void) doSomethingAndExplain:(NSString **)explanationP; >> // NSString** parameter is implicitly __autoreleasing NSString ** >> >> __autoreleasing NSString **explanationP = urgent ? NULL : &explanation; >> [self doSomethingAndExplain:explanationP]; >> >> The first version may have better performance because it avoids the >> autorelease pool. > > Another way (I don't know how efficient it is though) is: > [self doSomethingAndExplain: urgent ? NULL : &explanation ]; > > Does this use autorelease pool ?
Yes. By default, an argument of type id* is assumed to be __autoreleasing id *, because that's the common convention for out-parameters in Cocoa. It is generally more efficient to make your out-parameters __strong id*, but of course that requires a bit more work from MRC callers, which is why it's not the standard convention. John. _______________________________________________ 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