这两个NSString方法之间的区别
所以我刚刚在今天的一个采访中被问到了这个问题,经过一些Googlesearch后,我仍然无法找出答案(实际上,我甚至找不到任何使用[NSString string]方法的代码)。
有什么区别
NSString *someString = [NSString string];
-
NSString *someString = [[NSString alloc] init];
现在我最初的想法是, [NSString string]
将返回一个对象,这将是autoreleased而使用alloc和init将返回一个对象已被保留。 但是,似乎这个答案是不正确的。
我已经看过苹果文档中的NSString类的引用,但它说的是
Returns an empty string. + (id)string Return Value An empty string.
有人可以向我解释这两者之间的区别吗?
现在我最初的想法是
[NSString string]
将返回一个将被autoreleased的对象
从技术上讲,它是一个不变的占位符string,即它贯穿整个程序执行,永远不会被释放。 这不是一个自动发布的string。 从概念上讲,这就是我作为一个访问者的焦点,它是一个不属于调用者的string(一个空string),因此调用者不应该释放它。
而使用alloc和init会返回一个被保留的对象
从技术上讲,它是一个常量的占位符string,即它贯穿整个程序执行过程。 实际上,它和上面的一样,不保留。 从概念上讲,这就是我作为一个访问者所关注的内容,它是一个由调用者拥有的string(一个空string),因此调用者在不再需要时负责释放它。
那是你的回答吗,你问你为什么回答不正确? 我问,因为你的假设大部分是正确的(在更高的水平)。
从alloc+init
返回时,它不是“保留”的,它是一个引用的对象,应该与release
或autorelease
平衡。 对于方便的构造函数( +[NSString string]
),返回一个你持有0引用的对象,但是你可以预期直到当前的自动释放池被popup,除非你发送一个明确的保留(假设MRC或ARC,因为它被标记为iOS)。
在较低的层面上,你可以猜测一下,但在许多objc访谈中(除非你告诉他们你是中高层),否则我不会期待这个问题。 基本上,它是实现定义的,但是这两种forms都可以返回相同的静态常量NSString
(可能是面试官所期待的)。 为了显示:
@implementation NSString static NSString * const EmptyNSString = @""; - (id)init { self = [super init]; [self release]; return EmptyNSString; } + (id)string { return EmptyNSString; } ...
同样,这是实现定义,但明显的优化。 而且, 在某些情况下 ,这种优化使物理上对具体的不可变types(NSString)进行子类化是很困难的(NSMutableString)。
正确的答案是
NSString *someString = [NSString string];
给你一个你不拥有的空string,你不能释放(根据内存pipe理规则)
而
NSString *someString = [[NSString alloc] init];
给你一个你自己的空string,你必须释放(根据内存pipe理规则)。
如果不考虑执行,就不能说这两个string的任何其他内容。 你不能说他们是自我释放,因为他们可能不是,你不能说什么保留计数。
实际上,你可能会得到(在这两种情况下)同一个指向某个NSString子类的常量对象的指针,可能保留的UINT_MAX
数量被运行时间用作标志来禁止正常的保留发布行为常量string。 我还没有真正尝试过以上,因为除了Objective-C SDK的维护者之外,没有人需要关心。
你不经常看到
NSString *someString = [NSString string];
因为它是一样的
NSString *someString = @"";
这是更短的。 它通常用于创build一个空的NSMutableString
NSMutableString* s = [NSMutableString string];
我能想象的唯一的事情是:
-
不会分配内存,因为它不是用alloc创build的。 它是由系统制作的常量(空string),不需要释放。
-
你自己为NSString分配内存,这意味着当你完成NSString的时候,如果NSString仍然“存活”,那么你必须保持跟踪,因此需要释放它。