【问题标题】:Advantage of data type id vs NSString in Objective C?Objective C中数据类型id与NSString的优势?
【发布时间】:2009-10-19 16:29:20
【问题描述】:

这段代码...

NSString * s = [[NSString alloc] initWithString:@"Hello, World"]; 
s = s.lowercaseString;
NSLog(@"%@", s);

...允许使用点表示法,但是是强类型的。 这段代码...

id s = [[NSString alloc] initWithString:@"Hello, World"]; 
s = [s lowercaseString];
NSLog(@"%@", s);

... 是弱类型,需要使用方括号。

除此之外,使用一个比另一个有什么优势吗?

【问题讨论】:

  • 不是真的,其他问题询问NSObject*id 之间的区别。这个问题在这里询问为什么要明确使用正确的类型。
  • @gs:它们都是关于 Objective-C 静态类型的,而且这个问题的答案也回答了这个问题。仅仅因为一个使用一个类作为示例而另一个使用不同的类并不会使它们有显着不同。

标签: objective-c memory nsstring


【解决方案1】:

如果您要创建NSString,那么不妨将其声明为NSString,让编译器帮助您。

使用 id 的目的是防止强耦合,并使用直到以后才知道类型的对象。例如,IBAction 方法将 sender 作为参数作为 id 包含在内,因为对象的确切类型是未知的。

编辑添加:

你可能是这门语言的新手,所以我会提到几件事

首先,你有@"Hello, World",你已经有一个NSString,只是一个静态的。所以你不需要通过initWithString 来创建它。随便写:

NSString *s = @"Hello, World";

而且,因为你没有alloc它,所以你不必担心发布它。

其次是 s.lowerCaseString。正如斯蒂芬已经回答的那样,这被认为是不好的风格。当您将字符串更改为小写时,您不会获得字符串的属性,而是导致对字符串进行操作,在这种情况下,您确实应该使用括号语法。

【讨论】:

    【解决方案2】:

    是的。如果您尝试将 NSString 放入需要 NSNumber 的方法中,编译器会警告您。

    编译器更有可能发现你的错误。

    【讨论】:

      【解决方案3】:

      可以说前面的代码是不正确的。您应该只真正使用点符号来获取/设置属性,lowercaseString 是一种方法。

      否则,正如您所建议的,唯一真正的区别是类型安全。如果你有错别字,比如你输入了[a loercaseString],编译器不会对你大喊大叫。

      在某些情况下您肯定会使用id,但您的示例不是其中之一

      【讨论】:

      • 哦,抱歉打错了。我只是想更正第一种方法,但是当我按下“编辑”时,我看到了loercase,并没有阅读上下文。
      • 不用担心。您通常不会期望人们故意写错字!
      猜你喜欢
      • 2018-10-12
      • 2011-10-05
      • 2012-01-24
      • 1970-01-01
      • 1970-01-01
      • 2011-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多