指针语法*对象与对象

时间:2013-10-05 20:09:28

标签: objective-c

有什么区别:

NewClass *object = [NewClass new];
printf("%s", [object stringValue]);

NewClass *object = [NewClass new];
printf("%s", [*object stringValue]);

第二个当然不起作用。但为什么?什么时候使用*而不是?

1 个答案:

答案 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;

我们通常说aStringNSString,而它实际上是指向NSString的指针。这可能看起来令人困惑,但语言的设计使其非常透明,因此它已成为常用术语的一部分。