屬性一般不加下劃線
聲明的屬性對應setter方法中的形參,而不是執行個體變量,這一點一定要注意 注意:實作屬性的時候,name=_name代表将形參和執行個體變量建立關系,而不是指派 可以把相同類型的屬性定義在一行,但是最好不要這麼做,因為這樣會降低程式的可讀性,我們一般都是一個屬性定義一次.
@synthesize name=_name; 可以省略,如果你定義了執行個體變量_name,那麼Xcode會自動幫你去定義屬性的實作@synthesize name=_name;即幫你去關聯執行個體變量_name.
執行個體變量也可以省,如果你将屬性的實作和執行個體變量都省掉了,系統會預設建立一個私有的(extersion)執行個體變量_name,如果你非常遵守蘋果的命名規範的話,這無疑大大的簡化了你的代碼!但是,私有化的執行個體變量,在被子類繼承的時候,是不可見的,即子類無法直接使用_name=@"aaaa",會報錯,但是可以用setter,getter方法:[self setName:@"aaaaa"];
@synthesize name;如果你沒有全部省掉,而隻是把"=_name"這部分省略掉了,那麼系統會給你建立一個私有的(extersion)執行個體變量name,注意是name,這樣問題就來了,因為你的屬性是name,而形參的優先級是最高的(越往裡越高),是以會出錯,變量名重複,無法得到我們想要的結果. @synthesize 實作的屬性,可以用點文法,指派和取值都可以,如:
p.name=@"aaaaaaaa"; //可以用點文法直接給屬性指派
NSLog(@"-------%@",p.name);//可以用點文法取屬性值
屬性也可以用getter和setter,如:
[p setName:@"bbbbbbb"]; //預設生成的set方法的方法名是setName
NSLog(@"-------%@",[p getName]);//注:用屬性生成的get方法預設的方法名是name,不是“getName”。是以不能用getName調用,這裡要注意。
如果沒有用@property将成員變量定義為屬性,而是自己定義get(通路器),set(設定器)方法實作成員變量的指派取值,則要注意:
1.自己定義的getter(通路器)最好不要定義成get+屬性名,例如:getName。因為,OC中底層的一些函數的實作已經占用了get方法。那麼這時如果你這樣定義,那麼很可能造成沖突。一般我們直接用屬性名(如name)作為通路器的關鍵字。
2.OC中得點文法的用法和C中稍有不同:在C中,你可以直接用p.name進行複值取值,但是在OC中你要注意,OC中用點文法給執行個體變量指派,可直接用[email protected]“aaaaa”,但是取值就和C不一樣了。取值的使用方法是“p.通路器關鍵字”。即:如果你定義的通路器是getName,那麼你用點文法取執行個體變量name的值就要用p.getName,而不是p.name,這點要注意。
3.如果你沒用@property 定義屬性,而是自己定義通路器和設定器,那麼如果你隻定義了get,你就能用點文法的取值功能,如:NSLog(@"-------%@",p.name),但是不能用指派功能set。反之也一樣。
最後,隻有設定為屬性的或者自己定義了設定器通路器的執行個體變量才能使用點文法。
關于可見度:
@public 聲明為公共的成員變量,不需要設定器和通路器就可以通路該變量,當然你也可以添加設定器通路器。通路的方式為p->name,隻能用這種方式通路變量,否則會報錯。