2012-07-27 72 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