Re: Arc and **
Re: Arc and **
- Subject: Re: Arc and **
- From: "Gerriet M. Denkmann" <email@hidden>
- Date: Wed, 05 Dec 2012 13:44:38 +0700
On 5 Dec 2012, at 12:59, Greg Parker <email@hidden> wrote:
> On Dec 4, 2012, at 8:56 PM, Gerriet M. Denkmann <email@hidden> 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 ?
Kind regards,
Gerriet.
_______________________________________________
Cocoa-dev mailing list (email@hidden)
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:
This email sent to email@hidden