Obj-C中[object variable]和object.variable之间的区别?

Joh*_*ith 3 iphone xcode cocoa objective-c

我今天正在制作一个程序并且遇到了这个奇怪的bug.我有一个分配了动作的UIButton.这个动作是这样的:

-(void) someaction:(id) e
{
    if ([e tag]==SOMETAG)
    {
        //dostuff
    }
}
Run Code Online (Sandbox Code Playgroud)

令我困惑的是,当我第一次写它时,if行是

if (e.tag==SOMETAG)
Run Code Online (Sandbox Code Playgroud)

XCode拒绝编译它,说

error: request for member 'tag' in 'e', which is of non-class type 'objc_object*'
Run Code Online (Sandbox Code Playgroud)

但我认为这两个是相同的.

那么它们在什么情况下不一样呢?

Jas*_*ien 5

仅当变量具有声明的关联属性,或者存在可用的符合键值编码的访问器方法时,才可以使用点表示法.属性语法允许您为符合键值编码的变量"合成"访问器方法,实际上,这就是点符号的工作方式.

声明属性时,someObject.variable相当于[someObject variable].

当对象键入为id时,编译器不知道该对象具有的任何属性.id是指向任何对象的指针,实际上是void*.

您可以将对象转换为您期望的类型,这样您就可以使用属性语法.

((MyObject*)e).tag
Run Code Online (Sandbox Code Playgroud)

  • 这是错的.您可以将点表示法与任何*声明的*访问器方法一起使用,无论是声明为属性还是方法/方法对. (2认同)