接受的答案具有误导性,因此即使是重复的问题,我也会在此处提供解释。
首先,您仅将*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 的指针。这可能看起来令人困惑,但语言的设计使其非常透明,因此它已成为常用术语的一部分。