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

标签 iphone objective-c cocoa xcode

我今天在做一个程序,遇到了这个奇怪的错误。我有一个分配了 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/

相关文章:

objective-c - Objective C,圆角自定义窗口?

iphone - 如何在NSCalender中设置事件?

iphone - 如何在 NSSet 或 NSArray 中搜索具有特定属性的特定值的对象?

ios - Base64 到给定格式的图像

iphone - Objective-c 指针

objective-c - 调试运行时错误: 'NSInternalInconsistencyException' ,原因: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath'

iphone - iOS 模拟器只列出最新的 iOS 版本。如何设置早期版本

iphone - 我可以分配由 AVAssetExportSession 导出的 m4a 的采样率或比特率吗

ios - 为什么我的应用程序崩溃了?我无法重现错误,但收到此崩溃日志 :

objective-c - 如何构建Apple的Son ofgrab示例?