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)
但我认为这两个是相同的.
那么它们在什么情况下不一样呢?
仅当变量具有声明的关联属性,或者存在可用的符合键值编码的访问器方法时,才可以使用点表示法.属性语法允许您为符合键值编码的变量"合成"访问器方法,实际上,这就是点符号的工作方式.
声明属性时,someObject.variable
相当于[someObject variable]
.
当对象键入为id时,编译器不知道该对象具有的任何属性.id是指向任何对象的指针,实际上是void*.
您可以将对象转换为您期望的类型,这样您就可以使用属性语法.
((MyObject*)e).tag
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
407 次 |
最近记录: |