此代码......
NSString * s = [[NSString alloc] initWithString:@"Hello, World"];
s = s.lowercaseString;
NSLog(@"%@", s);
...允许使用点表示法,但是强类型。 这段代码......
id s = [[NSString alloc] initWithString:@"Hello, World"];
s = [s lowercaseString];
NSLog(@"%@", s);
...是弱类型的,需要使用方括号。
除此之外,使用一个优于另一个有什么好处吗?
答案 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
的情况,但您的示例不是其中之一