16.繼承xcode
1)不能和父類定義同樣的變量spa
2)單一繼承,不支持繼承多個類指針
3)支持多層繼承子類也能夠被繼承code
17.實例變量修飾符orm
public:公開的,在其餘類中也能夠訪問對象
protected:受保護的類型,只能在當前類和子類中訪問blog
private:不能直接訪問繼承
.h文件中沒有聲明的變量和方法,只在.m文件中定義,不能被繼承和使用ip
18.%@打印對象的地址,默認調用對象的description方法,能夠重寫此方法get
19.多態:不一樣的對象以本身的方式響應相同名稱方法的能力稱爲多態
父類指針指向子類的對象
20.類的本質是類對象
1)Class c1=[d class];Class c1=[d1 class];若是d和d1是同一個類的對象,那個c1和c2指向相同的地址
2)獲取方式,經過實例對象獲取Class c1=[d class];,經過類名獲取Class c1=[Dog class];
3)類對象的使用,代替類名new對象
21.SEL s1=@selector(test)//手動把test方法包裝成sel類型
[p performSelector:s1];//向test方法發送sel消息,這兩句話至關於[p test];
22.點語法的本質是調用getter、setter方法,不是訪問成員變量
對象.屬性=...;//替換爲set方法
...=對象.屬性;//替換爲get方法
23.@property的使用
寫在聲明文件中,至關於定義get、set方法聲明
#import <Foundation/Foundation.h>
@interface Animal : NSObject
{
int _age;
}
@property int age;
//-(void)setAge:(int)age;
//-(int)age;
@end
24.@synthesize的使用
寫在實現文件中至關於註釋部分的代碼
#import "Animal.h"
@implementation Animal
@synthesize age;
//-(void)setAge:(int)age{
// self->age=age;//@synthesize age會自動新建一個age實例變量
//}
//-(int)age{
// return self->age;
//}
@end
@synthesize age=_age;//指定實例變量名,不會操做默認的變量
至關於:
//-(void)setAge:(int)age{
// _age=age;
//}
//-(int)age{
// return _age;
//}
xcode4.4以後,能夠只使用@property而不使用@systhesize,而且不用定義帶有下劃線的變量
操做的是帶有下劃線的實例變量,若是當前類沒有下劃線的實例變量,則系統會幫咱們生成。注意該變量是私有的(相對的,隱藏的)子類看不到
@property的加強型,在.m文件中重寫get、set方法,可是不能同時重寫,只能重寫一個
25.動態類型和靜態類型
動態類型:父類的指針指向子類的對象
靜態類型:
26.id的使用,id是一個萬能指針,能夠指向任何對象
NSObject和id均可以指向任何對象
NSObject對象會進行編譯時檢查(須要強制類型轉換)
id不須要強制類型轉換,id能夠直接用
編譯器看到id之後,認爲是動態類型,再也不檢查
id obj=[Animal new];
27:動態綁定,內省
動態類型檢測:
1)判斷類型
1))判斷某個對象是不是類的實例對象,或者子類的事例對象
BOOL isKind = [ani isKindOfClass:[Animal class]];(對象和類)
2))判斷是不是這個類的事例,無論是不是這個類的子類的事例
isMemberOf(對象和類)
3))判斷是不是子類的事例
isSubClassOfClass
BOOL isKind = [Dog isSubClassOfClass:[Animal class]];(類和類)
2)方法響應的檢測
1))判斷對象可否響應指定的方法:
respondsToSelector:方法的SEL
2))判斷類可否響應指定的方法
instanceResponseToSelector:方法的SEL
3)響應方法
無參:performSelector:SEL
有一個參數:performSelector:SEL withObject:@"參數"
有兩個參數:performSelector:SEL withObject:@"參數" withObject:@"參數2"
28.構造方法init,是一個對象方法,返回的是一個對象-調用init方法的對象
29.重寫構造方法
-(instancetype)init{
self = [super init];
if(self){
_age=10;
}
return self;
}