stringWithFormat vs. initWithFormat on NSString

前端 未结 2 493
深忆病人
深忆病人 2021-02-01 20:34

I am wondering what differences such as disadvantages and/or advantages there are to declaring an NSString this way:

NSString *noInit = [NSString stringWithForma         


        
相关标签:
2条回答
  • 2021-02-01 20:49

    I actually came across this blog entry on memory optimizations just yesterday. In it, the author gives specific reasons why he chooses to use [[NSString alloc] initWithFormat:@"..."] instead of [NSString stringWithFormat:@"..."]. Specifically, iOS devices may not auto-release the memory pool as soon as you would prefer if you create an autorelease object.

    The former version requires that you manually release it, in a construct such as this:

    NSString *remainingStr = nil;
    if (remaining > 1)
        remainingStr = [[NSString alloc] initWithFormat:@"You have %d left to go!", remaining];
    else if (remaining == 1)
        remainingStr = [[NSString alloc] initWithString:@"You have 1 left to go!"];
    else
        remainingStr = [[NSString alloc] initWithString:@"You have them all!"];
    
    NSString *msg = [NSString stringWithFormat:@"Level complete! %@", remainingStr];
    
    [remainingStr release];
    
    [self displayMessage:msg];
    

    Here, remainingStr was only needed temporarily, and so to avoid the autorelease (which may happen MUCH later in the program), I explicitly handle the memory as I need it.

    0 讨论(0)
  • 2021-02-01 21:04

    stringWithFormat: returns an autoreleased string; initWithFormat: returns a string that must be released by the caller. The former is a so-called "convenience" method that is useful for short-lived strings, so the caller doesn't have to remember to call release.

    0 讨论(0)
提交回复
热议问题