抱歉,我无法在标题中更具描述性。我知道C ++和C#,以及一些Java,我正在做一些Objective 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
是如何工作的。
有人能解释一下这里发生了什么吗?
感谢。
答案 0 :(得分:3)
你的猜测是正确的 - 这种称为点符号的语法被编译器转换为对[r setOrigin:p]
的调用。一般的想法是,就像大多数其他语言一样,你有对象属性的getter和setter;在Objective-C中,这些通常写成:
- (type)variableName;
- (void)setVariableName:(type)aVariable;
只要您自己的代码符合这些约定,您就可以使用点表示法来获取和设置类的变量,并相信您的方法被调用。
幕后显然会有很多事情发生,所以我希望这个简短的解释对你来说已经足够了。但是,如果您感兴趣,可以进一步了解:
BOOL
变量'getter通常写为-isVariableName
而不是-variableName
),以及如何使用@property
来管理它们属性答案 1 :(得分:1)
是的,点符号调用的属性访问器会自动转换为编译器的方法调用;从而
variable = object.property;
相当于
variable = [object property];
和
object.property = variable;
相当于
[object setProperty:variable];