有什么区别:
NewClass *object = [NewClass new];
printf("%s", [object stringValue]);
和
NewClass *object = [NewClass new];
printf("%s", [*object stringValue]);
第二个当然不起作用。但为什么?什么时候使用*
而不是?
答案 0 :(得分:0)
接受的答案具有误导性,所以即使这是一个重复的问题,我也只是在这里提供一个解释。
首先,您只使用*object
进行声明并且永远不会使用。 Objective-C中的指针只是指针,因此您可以相应地使用它们。
作为一个例子,这里是Cocoa中的一个典型模式,你通过引用传递(指向)NSError
实例:
NSError *error = nil;
BOOL success = [self methodThatMayFailWithError:&error];
if (!success) {
NSLog(@"%@", error.localizedDescription);
//handle error
}
其中-methodThatMayFailWithError:
被声明为
- (BOOL)methodThatMayFailWithError:(NSError **)error {
if (somethingVeryBadHappened) {
*error = [NSError errorWithDomain:@"myAppDomain" code:42 userInfo:@{NSLocalizedDescriptionKey : @"You screwed up!"}];
return NO;
}
return YES;
}
正如您所看到的,实现取消引用NSError **
指针以获取NSError *
。
所以指针是指针。周期。
也就是说,在Objective-C中,指针的使用非常无缝。这是因为Objective-C运行时用于操作指向对象的指针。考虑这个例子:
NSString *aString = @"Hello";
NSUInteger stringLength = [aString length];
[aString length]
将 - 或多或少 - 将导致以下运行时代码
objc_msgSend(aString, @selector(length));
现在,如果您查看objc_msgSend
id objc_msgSend(id theReceiver, SEL theSelector, ...)
你会注意到它需要一个id
类型的参数,这意味着一个指向对象的指针。
该示例说明了整个Objective-C消息传递系统是如何设计为使用指针的,这就是为什么要声明指针,并且在使用它们之前不要取消引用它们。
这也会导致滥用术语object
。
NSString *aString;
我们通常说aString
是NSString
,而它实际上是指向NSString
的指针。这可能看起来令人困惑,但语言的设计使其非常透明,因此它已成为常用术语的一部分。