Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 这两种NSString方法之间的区别_Iphone_Objective C_Ios_Nsstring_Class Cluster - Fatal编程技术网

Iphone 这两种NSString方法之间的区别

Iphone 这两种NSString方法之间的区别,iphone,objective-c,ios,nsstring,class-cluster,Iphone,Objective C,Ios,Nsstring,Class Cluster,所以我今天在一次采访中被问到这个问题,在谷歌搜索了几次之后,我仍然无法找到答案(事实上,我甚至找不到任何使用[NSString]方法的代码) 两者的区别是什么 NSString*someString=[NSString] NSString*someString=[[NSString alloc]init] 现在我最初的想法是,[NSString]将返回一个将自动删除的对象,而使用alloc和init将返回一个已保留的对象。然而,这个答案似乎是不正确的 我已经在apple文档中查看了NSStrin

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

两者的区别是什么

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

    我已经在apple文档中查看了NSString类引用,但它所说的是

    Returns an empty string.
    
    + (id)string 
    
    Return Value
    An empty string.
    

    有人能给我解释一下这两者的区别吗?

    是你的回答,你有没有问为什么你的回答不正确?我这样问是因为你的假设基本上是正确的(在更高的层次上)

    当从
    alloc+init
    返回时,它并不完全是“保留”的,它是一个您持有一个引用的对象,应该与
    release
    autorelease
    平衡。为了方便构造函数(
    +[NSString]
    ),将返回一个对象,该对象不包含任何引用,但如果不向其发送显式retain(假设MRC或ARC,因为它被标记为iOS),则该对象在当前自动释放池弹出之前可以一直存在

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

    @implementation NSString
    
    static NSString * const EmptyNSString = @"";
    
    - (id)init
    {
        self = [super init];
        [self release];
        return EmptyNSString;
    }
    
    + (id)string
    {
        return EmptyNSString;
    }
    
    ...
    
    同样,这是实现定义的,但显然是一种优化。此外,这种优化在某些情况下会使可变变体(NSMutableString)在物理上难以对具体的不可变类型(NSString)进行子类化。

    您不常看到

    NSString *someString = [NSString string]; 
    
    因为它和

    NSString *someString = @""; 
    
    哪个比较短。它通常用于创建空NSMutableString

    NSMutableString* s = [NSMutableString string];
    
    现在我最初的想法是,
    [NSString]
    将返回一个将自动删除的对象

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

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


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

    我唯一能想象的是:

  • 不会分配内存,因为它不是用alloc创建的。它是由系统生成的常量(空字符串),不需要释放

  • 您可以自己为NSString分配内存,这意味着您必须跟踪NSString在使用完后是否仍然“存在”,因此需要释放它


  • 正确答案是

    NSString *someString = [NSString string];
    
    为您提供一个空字符串,您不拥有该字符串,并且不能释放该字符串(根据内存管理规则)

    鉴于

    NSString *someString = [[NSString alloc] init];
    
    为您提供一个空字符串,您确实拥有该字符串,并且必须释放该字符串(根据内存管理规则)

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


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

    如果这是你没有得到这份工作的唯一原因,那似乎有点不公平。在iOS5(使用ARC)中,它们是一样的。@jrturton这只是我被问到的众多问题之一,我不认为这是我是否通过面试阶段的唯一原因justin,我没有问这是否是错误的,因为我们的面试时间有点短,但他们问我是否确定我的答案是正确的,让我再看一遍这个问题,我困惑地看了他们一眼,然后我们继续。@Jason啊,好的。因此,这个问题的答案可能令人满意,也可能不令人满意,他们想知道您是否知道我概述的优化(或者其他方面)。@JeremyP为什么不。。。还是你指的是我在编辑中澄清的一点?@Justin:为什么不呢,请看我的答案。然而,在重读你的答案时,我认为我的反对票是严厉的,所以我将其删除。@JeremyP好吧,在我意识到这一点后,有几点我的措辞很糟糕,并在我意识到这一点后进行了更新……这两种说法是否真的有完全相同的含义,背景中没有发生有趣的事情?我问这个问题是因为我很好奇为什么NSString类会有一个永远不会实际使用的string方法?请注意,
    +[NSString string]
    返回的常量空字符串与
    @“
    不是同一个对象。它在NSMutableString*s=[NSMutableString]的情况下很有用;投反对票的人能解释一下情况吗