我一直在想这件事。
我有一个名为hitCounter的@property,它工作得很好:
if ([[someArray objectAtIndex:i] hitCounter]!=0) continue;
没问题,它起作用了。没有我写的getter方法hitCounter;它是因为@synthesize而存在的,对吗?
但是,属性应该允许使用点符号。即使该属性存在,并且合成了该属性,并且导入了此数组中对象的类头,但以下两种情况都不会编译:
if ([someArray objectAtIndex:i].hitCounter!=0) continue;
或
if ((MyClass*)[someArray objectAtIndex:i].hitCounter!=0) continue;
编译器说的是property hitCounter not found on object of type id,但很明显我将它转换为MyClass,所以它不应该再是id类型--这是怎么回事?
发布于 2012-02-18 22:54:08
您应该将(MyClass*)[someArray objectAtIndex:i]放在括号中:
if (((MyClass*)[someArray objectAtIndex:i]).hitCounter!=0) continue;发布于 2012-02-18 23:00:03
编译器说在id类型的对象上找不到hitCounter属性,但是很明显我把它转换成了MyClass,所以它不应该再是id类型了--这是怎么回事?
这只是一个运算符优先级问题。您将整个表达式[someArray objectAtIndex:i].hitCounter的结果强制转换为MyClass*,但是您期望该强制转换仅应用于[someArray objectAtIndex:i]。使用括号来纠正这种情况,如sch的答案所示。
https://stackoverflow.com/questions/9342205
复制相似问题