代码:
if (!CGRectContainsPoint([[viewArray objectAtIndex:0] frame], CGPointMake(newX, newY)) )
{
....
}
我想得到一个"框架"视图数组中UIView的值,所以我使用了这个:
((UIView *)[viewArray objectAtIndex:0]).frame
我利用(UIView *)强制将id对象转换为UIView,否则会触发"属性' frame'没有找到类型' id'"的对象。但是下面的方法似乎成功摆脱了这个错误:
[[viewArray objectAtIndex:0] frame]
所以[id frame]可以自动检测id的真实类型,然后让它调用方法吗? 我真的想知道像这样的方法 [id frame] ---- id'的真实类型是UIView [id view] ---- id'的真实类型是UIViewController
这些方法是getter方法还是setter方法?我无法分辨差异,苹果文件显示它们像:
@property(nonatomic) CGRect frame
非常感谢你的帮助!
答案 0 :(得分:1)
最后调用的方法是-(CGRect)frame;
。使用点语法只是objective-c编译器提供的语法糖。为了使这个糖起作用,编译器需要知道它使用的对象的类型。
另一方面,objective-c使用消息传递来调用方法。这意味着当您使用语法[id message]
时,它将尝试在@selector(message)
上执行选择器id
。 id
是表示运行时中任何对象的特殊类型,它接受每个选择器,并且如果对象无法执行它,将在运行时抛出未知的选择器异常。
答案 1 :(得分:0)
通过定义像@Override
public void onCompletion(MediaPlayer mp) {
super.start();
}
这样的属性,该属性同时作为getter和setter。
例如,要修改框架的宽度,可以写:
@property(nonatomic) CGRect frame
有关点符号的详细说明,请参阅此answer。