首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在objective-c函数中使用* on指针?(2个例子)

在objective-c函数中使用* on指针?(2个例子)
EN

Stack Overflow用户
提问于 2012-04-03 04:54:50
回答 2查看 161关注 0票数 1

我正在尝试在objective-c中理解这一点:

在本例中,indexPath是一个指针,但我们在函数indexPath.section中“按原样”使用它,而不是(例如)*indexPath.section(带有*):

代码语言:javascript
复制
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    return (indexPath.section == 0) ? nil : indexPath;
}

因此,在objective-c中,我们不需要添加*来获取指针所指向的变量的内容...?

但是我发现了这个函数,他们在函数内部的指针上使用了一个* (在reverse上):

代码语言:javascript
复制
NSInteger lastNameFirstNameSort(id person1, id person2, void *reverse)
{
    NSString *name1 = [person1 valueForKey:LAST];

    //...

    if (*(BOOL *)reverse == YES) {
        return 0 - comparison;
    }

对于id变量,它们使用原样的变量名:例如这里:person1

那么,谁能给我解释一下这两个例子之间的区别:

为什么在第一个示例中,我们不在indexPath上添加*

为什么我们不在id变量上添加这个*,而是在第二个示例中将其与*reverse一起使用?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-03 05:11:15

您将点符号与读取结构混淆了。这并不奇怪,因为苹果让它们变得模棱两可。

indexPath.section不是指“indexPath中的section结构元素,甚至也不是指”indexPath中的属性section“,而是指[indexPath section]。它只是调用方法section并返回结果。

类似地,foo.bar = baz也不是字面意思是“将属性bar设置为baz”。字面意思是[foo setBar:baz]。无论setBar:做什么,都将完成。在大多数情况下,它会设置一个ivar。

由于从技术上讲,indexPath也是一个结构指针,所以在某些情况下(但并非总是如此,如果您正确编写代码,也不会经常这样),就有可能使用indexPath->section。你永远不应该这样做。(有一些极其罕见的例外,但您不太可能遇到它们。)

所有这些令人沮丧的是,foo.bar可能是一个结构引用,也可能是一个方法调用。如果不知道foo是什么,就不可能知道。这是点符号的问题之一。

如果你发现它令人困惑,不要使用点符号(它在有经验的开发人员中仍然是一个有争议的特性)。它从来不是必需的。这只是更显式的[foo bar][foo setBar:baz]的快捷方式。

*(BOOL *)result的意思是“将resultvoid*转换为BOOL *,然后将其作为BOOL解除引用,这与点符号无关。

票数 5
EN

Stack Overflow用户

发布于 2012-04-03 05:02:12

ObjC对象上的点语法(指向对象的指针)是使用java/c#/javascript like notation (object.property)访问表单对象获取方法和对象设置方法的一种方法。虽然语法并不完全一致,但直接属性访问已经采用了object > property。reverse只是一个普通的空指针,因此( BOOL *)将它转换为BOOL指针,并且在它之前的*取消引用它。id类型仍然是指针,只是ObjC中用于属性访问的语法与现有的C语法不一致。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9983695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档