對象的alloc+init
類對象的new方法可以創建一個屬性均為0的對象
new方法實際上是兩個方法的連續調用:
1)分配存儲空間 alloc 類對象方法
2)初始化 init 對象方法
也就是說 Person *p = [Person new]; 等同于: Person *p = [[Person alloc] init];
alloc和init方法都是NSObject的方法,故所有的OC類型都可以使用這種方式創建對象
init方法:
- (instancetype)init
該方法的默認操作:調用父類的init方法,并返回對象本身,成員變量的初值為0
重寫init方法
默認的init方法,將對象的屬性初值設為0,如果我們想要指定一個初值,就需要重寫該方法。
NSObject的子類重寫init方法的步驟:
1. 調用父類的init方法,將其父類中的屬性初始化
2. 為子類的屬性初始化
3. 返回對象本身
重寫init方法一般形式:
如:Person類,包含一個屬性_age
- (instancetype) init
{
if ( self = [super init] ) {
_age = 10;
}
return self;
}再如:Person的子類Student,包含一個屬性score
- (instancetype) init
{
if ( self = [super init] ) {//調用了父類Person的init函數
_score = 1;
}
return self
}init方法是一層一層往下調用的
重寫構造方法的目的是為了對象創建出來,成員變量就會有一些規定的值

自定義init方法
默認的Init方法不帶參數,只能為對象初始化一些固定值
通過自定義init方法可以實現通過參數初始化對象屬性。
返回值一般是instancetype類型
方法名以initWith開頭
如Person類中包含屬性name和age
- (instancetype) initWithName:(NSString *) name {
if ( self = [super init] ) {
_name = name;
}
return self;
}
- (instancetype) initWithName:(NSString*)name age:(int) age {
if ( self = [super init] ) {
_name = name;
_age = age;
}
}子類的init方法應指定調用父類的哪個init方法
如Person子類Student類:
- (instancetype) initWithName:(NSString *)name age:(int) age score:(int) score {
if ( self = [super initWithName:name age:age] ) {
//也可以用super的init方法及set方法,但不推薦
_score = score;
}
return self;
}有時我們需要創建一個現有對象的副本,則應編寫一個拷貝構造方法,參數為對象指針
- (instancetype) initWithPerson:(Person*) p
{
if ( self = [super init] ) {
_age = p.age;
_name = p.name;
}
return self;
}一個對象銷毀時,會調用一個dealloc方法
- (void)dealloc
該方法在最后應調用父類的dealloc方法
dealloc方法不能直接調用
需要注意的是,在引入ARC機制后,重寫這個方法時不能調用父類被重寫的dealloc方法
類對象
我們定義的類也是一種對象 ,是Class類的對象
Class創建Person類對象,再通過Person類對象方法來創建對象。
這里:類對象 == 類
之前說過,每個對象都一個isa指針,isa指針指向就是類對象

方法的調用過程:
實際上就是通過基類部分的isa屬性,找到成員函數列表,再將消息傳遞的參數拿過來和函數列表中的參數對比。 在自己的函數列表中找不到就到父類的函數列表中去找,直到找到為止。
類方法
通過對象調用的方法,稱為對象方法,如init description等。
通過類對象調用的方法,稱為類方法,如alloc new等。
+ (instancetype)alloc + (instancetype)new
對象方法在聲明和定義時,以-開頭
類方法在聲明和定義時,以+開頭
在類方法中,self表示類對象,super表示父類對象
類方法在子類中也可以被重寫 ,類方法和對象方法可以重名
訪問類對象:
任意對象都可以通過class方法,獲得其類對象
- (Class)class
也可以通過類的class類方法,獲得其類對象
+ (Class)class
如:(c1和c2是同一類對象)
Person *p1 = [Person new]; Person *p2 = [Person new]; Class c1 = [p1 class]; Class c2 = [p2 class]; Person *p3 = [c1 new];
類對象的加載
在程序運行開始時,會加載一次項目中所有的類,類加載完畢就會調用類的load方法。
程序在第一次使用這個類時,會調用類的initialize方法。
這兩個方法是可以重寫的,都是類對象方法
+ (void)load + (void)initialize
注意:
使用第一次使用該類時,會先調用該類的父類的initialize方法
當有分類時,類和分類的load方法都會被調用;第一次使用該類時,只會調用分類的initialize方法。
類方法封裝對象的創建
當實例化一個對象時,需要編寫類似下面的代碼:
Person *p = [[Person alloc] initWithAge:20];
這樣的代碼比較啰嗦,可以添加一個類方法來簡化:
+ (instancetype) personWithAge:(int) age
{
return [[Person alloc] initWithAge:age];
}這樣實例化對象的代碼為:
Person *p = [Person personWithAge:20];
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。