代碼:spa
@implementation Circle -(void) setFillColor: (ShapeColor) c { fillColor=c; } -(void) setBounds: (ShapeRect) b { bounds=b; } -(void) draw { NSLog(@"draw a cifrcle at(%d %d %d %d) in %@",bounds.x,bounds.y,bounds.width,bounds.heihgt,colorName(fillColor)); } @end
@implementioncode
是一個編譯器制定,代表你將爲某個類提供代碼。類名出如今@implemention以後,該行的結尾處沒有分號。對象
接下來是各個方法的定義。它們沒必要按照在@interface指令中的順序出現,你甚至能夠在@implementation中定義那些在@interface中無相應生命的方法。能夠把他們當作是私有方法,僅在類的視線中使用blog
你也許認爲,既然單獨在@implementation指令中定義方法,就不能從該實現以外訪問該方法。但事實並不是如此,Objective-C中不存在真正的私有方法,也沒法把某個方法標識爲私有方法,從而禁止其餘代碼調用它。這是Objective-C動態本質的反作用ci
setFillColor: 定義的第一行看上去與@interface部分的聲明很是相似。兩者的主要差異是結尾處沒有分號。咱們把參數從新命名爲簡單的c字符了,@interface和@implementation間的參數名不一樣是正確的。在這裏若是咱們繼續使用參數名fillColor,就會隱藏fillColor實例變量,而且編譯器會生成警告信息。編譯器
說明:爲什麼必定要從新命名fillColor呢?咱們已經經過類定義了一個名爲fillColor的實例變量,能夠在該方法中引用該變量——它在做用於範圍中。所以,若是使用相同的名稱定義一個變量,編譯器會阻止咱們訪問該實例變量,使用相同的變量名會隱藏處事變量,能夠爲參數使用新的名稱來避免該問題。io
@interface部分的方法生命中使用了名稱fillColor,是爲了確切告訴讀者參數的用處,在實現中,咱們必須區分參數名稱和實例變量名稱,最簡單的方式就是講參數從新命名。編譯
setFillColor方法只有一行代碼:fillColor=c;若是你特別好奇,可能會對實例變量的存儲位置感興趣,在Objective-C中調用方法時,一個名爲self的祕密隱藏參數將被傳遞給接收對象,而這個參數引用的就是該接收對象。例如,在代碼[circl setFillColor:kRedColor]中,方法將circle做爲其瑟利夫參數進行傳遞。由於self的傳遞過程是祕密的和自動的,所以你沒必要本身來實現。方法中引用實例變量的代碼以下所示:self->fillColor=c;順便提一下,傳遞隱藏的參數是另外一種間接操做的示例。由於Objective-C運行時(runtime)能夠將不一樣的對象當成隱藏的self參數傳遞,因此那些對象的實例變量發生更改時,運行時也可進行相應的更改。class
說明:用戶運行應用程序是,Objective-C運行時是支持這些應用程序的代碼塊。運行時執行很是重要的任務,如想對象發送消息和傳遞參數。變量