I have a situation where I need to use some strings temporarily but I’ve read so many conflicting things that I’m a bit confused as to what the best way to proceed is.
I need to assign some strings inside an if structure but use them outside the if structure so they need to be created outside the if, I was thinking something like:
NSString *arbString = [[NSString alloc] init];
if(whatever)
{
arbString = @"Whatever"
}
else
{
arbString = @"SomethingElse"
}
myLabel.text = arbString;
[arbString release];
I have seen examples where people just used:
NSString *arbString;
to create the string variable
Google’s Objective C guide says it’s preferred to autorelease at creation time:
“When creating new temporary objects, autorelease them on the same line as you create them rather than a separate release later in the same method”:
// AVOID (unless you have a compelling performance reason)
MyController* controller = [[MyController alloc] init];
// ... code here that might return ...
[controller release];
// BETTER
MyController* controller = [[[MyController alloc] init] autorelease];
So I have no idea, which is the best practice?
In the example you posted, you actually lose the reference to the NSString you created when you assign it in
arbString = @"Whatever". You then release the string constant (which is unreleasable, by the way).So there’s a memory leak, since you never release the NSString you created.
Remember that all these types are pointers, so
=only reassigns them.As for the question, in this example, you don’t need the
[[NSString alloc] init]. You don’t need to copy the string into a local variable anyway, you can just setmyLabel.textto the string constant@"Whatever".(edit: that’s not to say that you can’t use your pointer
arbString,arbString = @"Whatever"; myLabel.text = arbStringis fine. But this is just pointer assignment, not copying)If you needed to manipulate the string before you returned it, you would create an NSMutableString, and either release or auto-release it. Personally, create autoreleased objects using class methods, so in this example, I’d use
[NSString string], or[NSString stringWithString:], which return autoreleased objects.