7

所以我今天在一次采访中被问到这个问题,经过一番谷歌搜索后我仍然无法找出答案(事实上我什至找不到任何使用 [NSString string] 方法的代码)。

和有什么区别

  1. NSString *someString = [NSString string];
  2. NSString *someString = [[NSString alloc] init];

现在我最初的想法是,这[NSString string]将返回一个将被自动释放的对象,而使用 alloc 和 init 将返回一个已保留的对象。然而,这个答案似乎是不正确的。

我查看了苹果文档中的 NSString 类参考,但它所说的只是

Returns an empty string.

+ (id)string 

Return Value
An empty string.

有人可以向我解释一下这两者之间的区别是什么吗?

4

5 回答 5

5

那是您的回答吗?您是否问过为什么您的回答不正确?我问是因为你的假设大部分是正确的(在更高的层次上)。

从 返回时它并不完全“保留” alloc+init,它是您持有一个引用的对象,应该与releaseor平衡autorelease。对于方便的构造函数+[NSString string](标记的 iOS)。

在较低级别,您可以做出一些猜测,但我不希望在许多 objc 面试中出现这个问题(除非您告诉他们您是中级或高级)。基本上,它是由实现定义的,但两种形式都可以返回相同的静态常量NSString(这可能是面试官正在寻找的)。为了显示:

@implementation NSString

static NSString * const EmptyNSString = @"";

- (id)init
{
    self = [super init];
    [self release];
    return EmptyNSString;
}

+ (id)string
{
    return EmptyNSString;
}

...

同样,这是定义的实现,但显然是优化。同样,在某些情况下,这种优化使得可变变体 (NSMutableString) 的物理子类化具体不可变类型 (NSString) 变得困难。

于 2011-10-26T08:49:52.197 回答
4

现在我最初的想法是[NSString string]返回一个自动释放的对象

从技术上讲,它是一个恒定的占位符字符串,即它存在于整个程序执行过程中,永远不会被释放。它不是自动释放的字符串。从概念上讲,这是我作为面试官所关注的,它是一个不属于调用者的字符串(一个空字符串),因此调用者不应该释放它。

而使用 alloc 和 init 将返回一个已保留的对象

从技术上讲,它是一个恒定的占位符字符串,即它存在于整个程序执行过程中。其实和上面那个是同一个对象,没有保留。从概念上讲,这就是我作为面试官所关注的,它是一个由调用者拥有的字符串(一个空字符串),因此调用者有责任在不再需要它时释放它。

于 2011-10-26T08:56:11.713 回答
4

正确的答案是

NSString *someString = [NSString string];

给你一个你不拥有并且你不能释放的空字符串(根据内存管理规则)

然而

NSString *someString = [[NSString alloc] init];

给你一个你拥有的空字符串,你必须释放(根据内存管理规则)。

如果不深入了解实现,您就不能对这两个字符串说任何其他内容。你不能说它们是自动释放的,因为它们可能不是,你不能说保留计数是多少。

实际上,您可能会(在这两种情况下)获得指向某个 NSString 子类的常量对象的相同指针,可能带有一个保留计数,UINT_MAX运行时将其用作标志来禁用常量的正常保留释放行为字符串。我实际上并没有尝试过上述方法,因为除了 Objective-C SDK 的维护者之外没有人需要关心。

于 2011-10-26T09:04:17.960 回答
0

你不经常看到

NSString *someString = [NSString string]; 

因为它和

NSString *someString = @""; 

哪个更短。它通常用于创建一个空的 NSMutableString

NSMutableString* s = [NSMutableString string];
于 2011-10-26T08:53:36.083 回答
0

我唯一能想到的是:

  1. 不会分配内存,因为它不是用 alloc 制作的。它是系统生成的常量(空字符串),不需要释放。

  2. 您自己为 NSString 分配内存,这意味着您必须跟踪完成后 NSString 是否仍然“存在”,因此需要释放它。

于 2011-10-26T08:57:50.870 回答