Objective C中数据类型id与NSString的优势?

时间:2009-10-19 16:29:20

标签: objective-c memory nsstring

此代码......

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

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

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

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

除此之外,使用一个优于另一个有什么好处吗?

3 个答案:

答案 0 :(得分:12)

如果您正在创建NSString,那么您也可以将其声明为NSString,并让编译器为您提供帮助。

使用id的目的是防止强耦合,并使用直到以后才知道其类型的对象。例如,IBAction方法包括发送者作为参数作为id,因为对象的确切类型是未知的。

已编辑添加:

你可能不熟悉这种语言,所以我会提到一些事情

首先,在你拥有@"Hello, World"的地方,你已经有了一个NSString,只有一个是静态的。因此,您无需通过initWithString来创建它。只需写下:

NSString *s = @"Hello, World";

并且,因为你没有alloc它,你不必担心释放它。

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:4)

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

否则,正如您所说,唯一真正的区别是类型安全。如果你输了一个拼写错误,比如你放[a loercaseString],那么编译器就不会对你大喊大叫。

肯定有使用id的情况,但您的示例不是其中之一