Jas*_*son 7 iphone objective-c nsstring class-cluster ios
所以我今天在接受采访时被问到这个问题,经过一些谷歌搜索仍然无法找到答案(事实上我甚至找不到任何使用[NSString string]方法的代码).
有什么区别
NSString *someString = [NSString string];NSString *someString = [[NSString alloc] init];现在我最初的想法是[NSString string]返回一个自动释放的对象,而使用alloc和init将返回一个已保留的对象.然而,似乎这个答案是不正确的.
我查看了苹果文档中的NSString类引用,但它说的只是
Returns an empty string.
+ (id)string
Return Value
An empty string.
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释这两者之间究竟有什么区别吗?
这是你的回答,你问为什么你的答案不正确?我问,因为你的假设大多是正确的(在更高的层次上).
返回时它并不完全"保留" alloc+init,它是一个对象,你持有一个引用,并且应该与一个release或一个平衡autorelease.对于方便构造函数(+[NSString string]),您将返回一个对象,该对象保持零引用,但是在弹出当前自动释放池之前您可以使用该对象,除非您向其发送显式保留(假设为MRC或ARC,因为它是标记为iOS).
在较低级别,你可以做一些猜测,但我不会在许多对象访谈中期待这个问题(除非你告诉他们你是中级或高级).基本上,它是实现定义的,但两种形式都可以返回相同的静态,常量NSString(这可能是面试官正在寻找的).为了显示:
@implementation NSString
static NSString * const EmptyNSString = @"";
- (id)init
{
self = [super init];
[self release];
return EmptyNSString;
}
+ (id)string
{
return EmptyNSString;
}
...
Run Code Online (Sandbox Code Playgroud)
同样,这是实现定义,但明显的优化.同样,在某些情况下,该优化会使可变变体(NSMutableString)的物理子类化具体不可变类型(NSString)变得困难.
小智 4
\n\n\n现在我最初的想法是
\n[NSString string]返回一个会自动释放的对象
从技术上讲,它\xe2\x80\x99是一个恒定的占位符字符串,即它在整个程序执行过程中都存在,永远不会被释放。It\xe2\x80\x99s 不是自动释放的字符串。从概念上讲,这就是我作为面试官所关注的重点,它是一个不属于调用者所拥有的字符串(空字符串),因此调用者应该\xe2\x80\x99t释放它。
\n\n\n\n\n而使用 alloc 和 init 将返回一个已保留的对象
\n
从技术上讲,它\xe2\x80\x99是一个恒定的占位符字符串,即它在整个程序执行过程中都存在。事实上,它和上面的\xe2\x80\x99是同一个对象,并且没有被保留。从概念上讲,这就是我作为面试官关注的焦点,它是调用者拥有的字符串(空字符串),因此调用者负责在它\不再需要 xe2\x80\x99s。
\n