有什么区别:
NewClass *object = [NewClass new];
printf("%s", [object stringValue]);
和
NewClass *object = [NewClass new];
printf("%s", [*object stringValue]);
第二个当然不行。但为什么?你到底什么时候使用*
而不是?
有什么区别:
NewClass *object = [NewClass new];
printf("%s", [object stringValue]);
和
NewClass *object = [NewClass new];
printf("%s", [*object stringValue]);
第二个当然不行。但为什么?你到底什么时候使用*
而不是?
接受的答案具有误导性,因此即使是重复的问题,我也会在此处提供解释。
首先,您仅*object
用于声明而从不用于使用是不正确的。Objective-C 中的指针只是指针,因此您可以相应地使用它们。
例如,这是 Cocoa 中的一个典型模式,您通过引用传递(指向)一个NSError
实例:
NSError *error = nil;
BOOL success = [self methodThatMayFailWithError:&error];
if (!success) {
NSLog(@"%@", error.localizedDescription);
//handle error
}
where-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, ...)
你会注意到它需要一个 type 的参数id
,这意味着一个指向对象的指针。
该示例说明了整个 Objective-C 消息传递系统是如何设计为使用指针的,这就是为什么您声明指针并且在使用它们之前不取消引用它们的原因。
这也导致了对术语的一种误用object
。
NSString *aString;
我们通常说那aString
是一个NSString
,而它实际上是一个指向 的指针NSString
。这可能看起来令人困惑,但语言的设计使其非常透明,因此它已成为通用术语的一部分。