我今天在做一个程序,遇到了这个奇怪的错误。我有一个分配了 Action 的 UIButton。 Action 是这样的:
-(void) someaction:(id) e
{
if ([e tag]==SOMETAG)
{
//dostuff
}
}
让我感到困惑的是,当我第一次写它时,if 行是
if (e.tag==SOMETAG)
XCode 拒绝编译它,说
error: request for member 'tag' in 'e', which is of non-class type 'objc_object*'
但我认为两者是等价的。
那么在什么情况下它们不一样呢?
最佳答案
只有当变量声明了关联的属性,或者有符合键值编码的访问器方法可用时,才可以使用点表示法。属性语法允许您为符合键值编码的变量“合成”访问器方法,实际上,这就是点符号的工作方式。
声明属性时,someObject.variable
等同于[someObject variable]
。
当对象的类型为 id 时,编译器不知道该对象具有的任何属性。 id 是指向任何对象的指针,实际上是一个 void*。
您可以将您的对象转换为您期望的类型,这样您就可以使用属性语法。
((MyObject*)e).tag
关于iphone - Obj-C 中 [object variable] 和 object.variable 的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3019329/