+[NSString stringWithString:] — what's the point?

后端 未结 7 1753
悲&欢浪女
悲&欢浪女 2020-12-01 16:20

As NSString strings are immutable, what is the value of the stringWithString: class method?

I get the utility when used with NSMutabl

相关标签:
7条回答
  • 2020-12-01 16:37

    As another use case, if (for whatever reason) you create your own subclass of NSString or NSMutableString, stringWithString: provides a handy way to instantiate it with an instance of either NSString, NSMutableString, or MyCustomString.

    0 讨论(0)
  • 2020-12-01 16:37

    I often use +stringWithString: when I need to create an NSMutableString but start it with an initial value. For example:

    NSMutableString * output = [NSMutableString stringWithString:@"<ul>"];
    for (NSString * item in anArray) {
      [output appendFormat:@"<li>%@</li>", item];
    }
    [output appendString:@"</ul>"];
    
    0 讨论(0)
  • 2020-12-01 16:38

    You might have a NSMutableString (or some home-grown NSString subclass) that you want to duplicate.

    NSMutableString *buffer = [NSMutableString string];
    // do something with buffer
    NSString *immutableStringToKeepAround = [NSString stringWithString:buffer];
    

    Of course, you can also just make a copy:

    NSMutableString *buffer = [NSMutableString string];
    // do something with buffer
    NSString *immutableStringToKeepAround = [[buffer copy] autorelease];
    

    but you own the copy and must release or autorelease it.

    0 讨论(0)
  • 2020-12-01 16:39

    Returns a string created by copying the characters from another given string

    [NSString stringWithString:@"some string"]
    

    It is equivalent to

    [[[NSString alloc] initWithString:@"some string"] autorelease]
    
    0 讨论(0)
  • 2020-12-01 16:52

    As "Andy" points out in #318666, it's related to memory management, quoting:

    The difference between initWithString and stringWithString is that stringWithString returns an auto-released pointer. This means that you don't need to release it specifically, since that will be taken care of next time that the auto-release pool cleans up any auto-released pointers.

    initWithString, on the other hand, returns a pointer with a retain count of 1 - you do need to call release on that pointer, or else it would result in a memory leak.

    (Taken from here)

    0 讨论(0)
  • 2020-12-01 16:59

    Also, if you have a pointer to an NSString, it may actually be a subclass of NSString like NSMutableString. So, if you want to store the string and be guaranteed that it doesn't change, you should make a copy of it, hence stringWithString exists.

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