對不起,我不能在標題中更具描述性。我知道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
如何工作。
有人可以解釋這裏發生了什麼嗎?
謝謝。
好像它甚至不必須的屬性。 – Kurt 2012-07-27 20:36:16
@Kurt至少它是Obj-C 2.0的情況(但1.0無論如何都沒有屬性...) – 2012-07-27 20:38:57