1.成員變量修飾符
實例變量既可以在interface 也可以在@implementation 中定義
寫在@implementation 中的成員變量默認就是私有成員變量并且和@private 修飾不同 在@implementation 中定義的成員變量不外漏违诗,別的類中既無法查看也無法訪問
2.@property
在Xcode 4.4 之前 @property 自動生成 setter getter 的聲明
在4.4之后 @property 自動實現(xiàn)屬性的聲明和實現(xiàn) 并自動賦值給該屬性X對應(yīng)的成員變量_X
其中_X 變量是私有變量?
若同時重寫@property 聲明屬性X的setter 和 getter 方法 則不會幫你自動生成相對應(yīng)的_X成員變量
3.@synthesize
在Xcode 4.4 之前 @synthesize 自動生成 setter getter 的實現(xiàn)?
--1.@synthesize 后告訴編譯器,需要實現(xiàn)那個@property生成的聲明和實現(xiàn)
既在編譯階段實現(xiàn)setter 和 getter 方法
--2.@synthesize 需要緊挨個傳入的屬性 賦值給哪個成員變量和返回哪個成員變量告訴調(diào)用者
--3.若是@synthesize 后面沒有告訴系統(tǒng)將傳入的只值賦值給那個成員變量,系統(tǒng)會扣人賦值給和@synthesize 后面聲明的屬性名稱相同的成員變量
--4.@synthesize 后面聲明 沒有聲明屬性的賦值成員變量時,該屬性會默認賦值給和自己屬性名稱相同的成員變量 (@property 不同),該成員變量可以未被聲明
4.@property 修飾符號
@property(xxx) int age;
--1.readonly 只生成get方法沒有set方法
--2.readwrite 默認屬性钮莲,生成get 和 set方法
--3.getter = fooFuncName 重新聲明getter方法
--4 setter =fooFuncName 重新聲明setter方法 同 getter 方法同理
5. 動態(tài)數(shù)據(jù)類型id
id 為動態(tài)數(shù)據(jù)類型?
--1.靜態(tài)類型和動態(tài)類型
靜態(tài)類型:
將一個指針變量定義為特定類的對象時,使用的是靜態(tài)類型,在編譯的時候就知道這個指針變量所屬的類囊陡,這個變量是儲存特定類的對象
Person *p = [Person new];
動態(tài)類型:
知道執(zhí)行時才能確定對象所屬的類
id obj = [Person new];
id 相當于NSObject * 為一個萬能指針 因為所有的類都繼承于NSObject
通過動態(tài)數(shù)據(jù)類型定義的變量,可以調(diào)用子類特有的方法
通過動態(tài)數(shù)據(jù)類型定義的變量掀亥,可以調(diào)用私有方法
弊端:由于動態(tài)數(shù)據(jù)類型可以調(diào)用到任意方法撞反,所以有可能調(diào)用到不屬于自己的方法(父類調(diào)用子類方法),而編譯時又不會報錯搪花,導致運行時錯誤
為了避免動態(tài)數(shù)據(jù)類型引發(fā)的運行時錯誤 一般調(diào)用前會進行判斷?