2012-07-27 78 views
3

对不起,我不能在标题中更具描述性。我知道C++和C#,还有一些Java,我正在做一些Objective C教程,无法解释这里发生了什么。初学者对目标c,作业,属性等感到困惑

我会告诉你一个例子:

这里是矩形类的头/接口:

#import <Foundation/Foundation.h> 

@class XYPoint; 
@interface Rectangle : NSObject 

@property int width, height; 

-(int) area; 
-(int) perimeter; 
-(void) setW:(int)w andH:(int)h; 
-(XYPoint *) origin; 
-(void) setOrigin:(XYPoint*)pt; 

@end 

下面是执行:

#import "Rectangle.h" 

@implementation Rectangle{ 
    XYPoint *origin; 
} 

@synthesize width, height; 

-(void) setW:(int)w andH:(int)h 
{ 
    width = w; 
    height = h; 
} 

-(int) area{ 
    return width*height; 
} 

-(int) perimeter{ 
    return (width+height)*2; 
} 

-(XYPoint *) origin{ 
    return origin; 
} 
-(void) setOrigin:(XYPoint*)pt{ 
    origin = pt; 
} 

@end 

这里是我的主程序:

#import <Foundation/Foundation.h> 
#import "Rectangle.h" 
#import "XYPoint.h" 


int main(int argc, const char * argv[]) 
{ 
    @autoreleasepool { 

     Rectangle *r = [[Rectangle alloc]init]; 
     XYPoint *p = [[XYPoint alloc]init]; 

     [p setX:100 andY:300]; 
     [r setW:6 andH:8]; 

     r.origin = p; 

     NSLog(@"Width and height is %i %i", r.width, r.height); 
     NSLog(@"Origin is at %i,%i", r.origin.x, r.origin.y); 
     NSLog(@"Arear and perimeter are %i and %i", [r area], [r perimeter]); 

    } 
    return 0; 
} 

该行r.origin = p;混淆了我。究竟在哪里引用了哪个来源?接口中定义的getter方法,或实现中声明的实际成员变量?

注意来源不是属性。

说实话,我预料会出错。主程序应该只能看到getter方法,但它看起来不像是一个getter方法,它返回的内容可能位于赋值运算符的左侧。或者系统以某种方式将该语法映射到setOrigin的调用?

我所预料的唯一可能的途径原点设置会像[r setOrigin: p]

我可以看到像r.width = 5会的工作,因为宽度在头声明为一个属性,但我看不到r.origin = p如何工作。

有人可以解释这里发生了什么吗?

谢谢。

回答

3

您的猜测是正确的 - 称为点符号的语法被编译器翻译为对[r setOrigin:p]的调用。总体思路就像大多数其他语言一样,你有对象属性的getter和setter;在Objective-C,这些通常写为:

- (type)variableName; 
- (void)setVariableName:(type)aVariable; 

只要你自己的代码符合这些约定,你可以使用点符号都得到和你的类设置变量,您的信赖及方法调用。

在幕后有很多事情要做,所以我希望这个简短的解释对你来说已经足够了。如果你有兴趣,不过,你可以深入了解一下:

  • 合成性质和实际发生的情况 - 由编译器生成上面显示的形式的方法,与实际数据存储的实例变量沿
  • 键 - 值编码,它充分利用了这些原则和惯例对某些类型
  • 特殊情况下(例如,BOOL变量干将通常写为-isVariableName而非-variableName),以及如何与@property管理它们的属性
1

是的,由点符号调用的属性访问器被编译器自动转换为方法调用;因此

variable = object.property; 

相当于

variable = [object property]; 

object.property = variable; 

相当于

[object setProperty:variable]; 
+2

好像它甚至不必须的属性。 – Kurt 2012-07-27 20:36:16

+0

@Kurt至少它是Obj-C 2.0的情况(但1.0无论如何都没有属性...) – 2012-07-27 20:38:57