【问题标题】:Pointer syntax *object vs object [duplicate]指针语法 *object vs object [重复]
【发布时间】:2013-10-05 20:09:27
【问题描述】:

有什么区别:

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

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

第二个当然行不通。但为什么?你到底什么时候使用*而不是?

【问题讨论】:

  • 简短的回答是objc_msgSend 需要一个对象指针。
  • 看在上帝的份上,不要像这样取消引用 Objective-C 对象。它曾经在旧的 32 位和 64 位运行时下工作,但此时 isa 只是一个小问题。
  • 也使用NSLog(@"%@", object) 打印对象。

标签: objective-c


【解决方案1】:

接受的答案具有误导性,因此即使是重复的问题,我也会在此处提供解释。

首先,您仅将*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 的指针。这可能看起来令人困惑,但语言的设计使其非常透明,因此它已成为常用术语的一部分。

【讨论】:

    猜你喜欢
    • 2015-08-08
    • 1970-01-01
    • 2016-06-01
    • 2014-02-28
    • 2011-03-14
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 2016-10-31
    相关资源
    最近更新 更多