Why is NSString stringWithString returning pointer to copied string?

情到浓时终转凉″ 提交于 2019-12-01 19:44:12

1) Whenever you're creating a string using the @"" syntax, the framework will automatically cache the string. NSString is a very special class, but the framework will take care of it. When you use @"Some String" in multiple places of your app, they will all point to the same address in memory. Only when you're using something like -initWithData:encoding, the string won't be cached.

2) The other answers suggested that you should use -copy instead, but -copy will only create a copy of the object if the object is mutable. (like NSMutableString)
When you're sending -copy to an immutable object (like NSString), it'll be the same as sending it -retain which returns the object itself.

NSString *originalString = @"Some String";
NSString *copy = [originalString copy];
NSString *mutableCopy1 = [originalString mutableCopy];
NSString *mutableCopy2 = [mutableCopy copy];
NSString *anotherString = [[NSString alloc] initWithString:originalString];

--> originalString, copy, mutableCopy2 and anotherString will all point to the same memory address, only mutableCopy1 points do a different region of memory.

Since NSString instances are not mutable, the +stringWithString: method is simply returning the input string with an incremented reference count.

If you really want to force the creating of a new, identical string, try:

NSString * copy = [NSString stringWithFormat:@"%@", [arr objectAtIndex:0]];

There is little point in doing so, though, unless you need the pointer to be unique for some other reason...

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!