我正在尝试在objective-c中理解这一点:
在本例中,indexPath是一个指针,但我们在函数indexPath.section中“按原样”使用它,而不是(例如)*indexPath.section(带有*):
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
return (indexPath.section == 0) ? nil : indexPath;
}因此,在objective-c中,我们不需要添加*来获取指针所指向的变量的内容...?
但是我发现了这个函数,他们在函数内部的指针上使用了一个* (在reverse上):
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一起使用?
谢谢
发布于 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的意思是“将result从void*转换为BOOL *,然后将其作为BOOL解除引用,这与点符号无关。
发布于 2012-04-03 05:02:12
ObjC对象上的点语法(指向对象的指针)是使用java/c#/javascript like notation (object.property)访问表单对象获取方法和对象设置方法的一种方法。虽然语法并不完全一致,但直接属性访问已经采用了object > property。reverse只是一个普通的空指针,因此( BOOL *)将它转换为BOOL指针,并且在它之前的*取消引用它。id类型仍然是指针,只是ObjC中用于属性访问的语法与现有的C语法不一致。
https://stackoverflow.com/questions/9983695
复制相似问题