什么是iOS中的(CGRect *)框架方法?

时间:2015-07-21 12:53:54

标签: ios objective-c uiview uiviewcontroller properties

  1. 代码:

    if (!CGRectContainsPoint([[viewArray objectAtIndex:0]  frame], CGPointMake(newX, newY)) )
    {
         ....
    }
    
  2. 问题
  3. 我想得到一个"框架"视图数组中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
    

    非常感谢你的帮助!

2 个答案:

答案 0 :(得分:1)

最后调用的方法是-(CGRect)frame;。使用点语法只是objective-c编译器提供的语法糖。为了使这个糖起作用,编译器需要知道它使用的对象的类型。

另一方面,objective-c使用消息传递来调用方法。这意味着当您使用语法[id message]时,它将尝试在@selector(message)上执行选择器idid是表示运行时中任何对象的特殊类型,它接受每个选择器,并且如果对象无法执行它,将在运行时抛出未知的选择器异常。

答案 1 :(得分:0)

通过定义像@Override public void onCompletion(MediaPlayer mp) { super.start(); } 这样的属性,该属性同时作为getter和setter。

例如,要修改框架的宽度,可以写:

@property(nonatomic) CGRect frame

有关点符号的详细说明,请参阅此answer