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.


-- 
Greg Parker     gpar...@apple.com     Runtime Wrangler



_______________________________________________

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