What is the different between NSCFString and NSConstantString?

与世无争的帅哥 提交于 2019-11-30 08:22:35

问题


I declare the object variable as a NSString But when I use the XCode to look into my object, I saw there are two type of String, it seems that the system automatically transfer to another:

What are the different between them? Are they interchangeable to one and others. Also, what is the condition two change to another?

Thanks.


回答1:


They're both concrete subclasses of NSString. __NSCFString is one created during runtime via Foundation or Core Foundation, while __NSCFConstantString is either a CFSTR("...") constant or an @"..." constant, created at compile-time.

Their interfaces are private. Treat them both as NSString and you should have no trouble.




回答2:


It appears to be an optimization done by the compiler. I'm guessing that the string that is getting converted to an NSCFConstantString is equal to one of the constants that is cached for performance reasons. Your NSCFString is just a toll-free bridged string that can be an NSString or a CFString. See this article for more information.




回答3:


As far as I know, NSCFConstantString is an implementation of NSString that keeps the string data in code memory. Compiler creates instances of it when you use @"string" constants. You can use NSCFConstantString anywhere an NSString could be used due to subclass/superclass relationship, but obviously not the other way around.




回答4:


One of benefits of transforming NSString to NSCFConstantString is next example:

For example - in method cellForRowAtIndexPath for tableView if you will write

NSString *ident = @"identificator";  NSLog(@"%p", ident); 

than it would be the same address for every cell. But with NSLog(@"%p", &ident) it would be different address for every cell.

NSString ident = @"identificator" is a special case - it is created as a __NSCFConstantString class so all equal string literals will share the same memory address to optimize memory usage. &ident will get an address of a local variable pointing to a NSString and will have NSString** type.

Reference to source (comments).



来源:https://stackoverflow.com/questions/10220683/what-is-the-different-between-nscfstring-and-nsconstantstring

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