用于读取属性的Obj-c点符号:为什么我不能像这样组合它?

时间:2011-04-19 06:02:20

标签: objective-c properties

我有这行代码:

[[[EntitlementsManager instance] entitlements] objectAtIndex:indexPath.row];

为什么它不能以下面的方式工作:

[EntitlementsManager.instance.entitlements objectAtIndex:indexPath.row];

好像它对我有用吗?我对它为什么不编译感到困惑。

FYI,EntitlementsManager,'instance'是返回其单例的'+'方法,'entitlements'是NSArray属性。

-edit:对于那些为什么说它不起作用,因为'instance'是一个静态'+'方法,那么为什么以下工作正常?我真的好奇:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return EntitlementsManager.instance.entitlements.count;
}

-edit2:这个 工作,奇怪的是:

... = [[EntitlementsManager instance].entitlements objectAtIndex:indexPath.row];

2 个答案:

答案 0 :(得分:1)

试试这种方式

[(EntitlementsManager.instance.entitlements)objectAtIndex:indexPath.row];

可能有效

答案 1 :(得分:1)

当Obj-C方法调用中.左侧出现 Type 时,解析器可能会感到困惑。例如,如果语法

'[' Type   methodAndArguments ']'

存在,然后在识别a '.' b之前对其进行解析,并且由于.instance ...不是 methodAndArguments 的预期构造,编译器将失败。由于Type.method不是点语法的预期用法,因此编译器支持它,或者甚至在将来使用语法错误时有效。

要么总是对类方法使用括号表示法,要么按照以下方式使用:

[[EntitlementsManager instance].entitlements objectAtIndex:0]

或将该表达式移到括号外:

NSArray* entitlements = EntitlementsManager.instance.entitlements;
[entitlements objectAtIndex:0];

或强制'[' Type methodAndArguments ']'不匹配:

[(nil, EntitlementsManager.instance.entitlements) objectAtIndex:0]