構造方法可以有返回值嗎 剖析透構造方法

2021-10-11 23:11:21 字數 1996 閱讀 9442

為什麼要呼叫父類的 init 方法?

當前類有 isa 指標,當前類的 isa 指標賦值是通過父類的 init 方法賦值的。

需要保證當前物件的父類屬性同時被初始化

重寫 init 方法的規範:

-(instancetype)init

return self;

}//person

#import @inte***ce person : nsobject

@property nsstring* name;

@property int age;

-(void)sayhi;

@end

#import "person.h"

@implementation person

-(void)sayhi

-(instancetype)init

return self;

}@end

//測試

person *p1 = [[person alloc] init]; = "杭城小劉",p1.age =22;

person *p2 = [person new]; = "杭城小劉",p2.age =22;

如果2個類的關係為組合關係,且它的乙個屬性是另乙個類的物件,那麼當該類初始化的時候預設它的屬性為 nil,那麼如何初始化?

-(instancetype)init

return self;

}//測試

person *p1 = [[person alloc] init]; != nil

注意:此時不能使用 new 來呼叫。(因為 new 的實現是先 alloc 再 init ,預設 init 的實現是給屬性賦預設值)

-(instancetype)initwithname:(nsstring *)name andage:(int)age

return self;

}//person

#import @inte***ce person : nsobject

@property nsstring* name;

@property int age;

-(instancetype)initwithname:(nsstring *)name andage:(int)age;

@end

#import "person.h"

@implementation person

-(instancetype)init

return self;

}//不能在構造方法之外給self賦值

//編譯器認為只有以initwith開頭的方法是構造方法

-(instancetype)initwithname:(nsstring *)name andage:(int)age

return self;

}@end

//測試

person *p1 = [[person alloc] init];

person *p2 = [person new];

person *p3 = [[person alloc] initwithname:@"杭城小劉2號" andage:23];

關於「自定義構造方法必須以 initwith 開頭」做個實驗

報錯資訊很明顯:不能在構造方法之外給 self 賦值

因為,編譯器認為只有以 initwith 開頭的方法是構造方法

構造方法可以重寫嗎 剖析透構造方法

為什麼要呼叫父類的 init 方法?當前類有 isa 指標,當前類的 isa 指標賦值是通過父類的 init 方法賦值的。需要保證當前物件的父類屬性同時被初始化 重寫 init 方法的規範 instancetype init return self person import inte ce per...

建構函式有返回值

function f1 console.log new f1 返回例項,委託原型 console.log new f1 name f1 console.log f1 name uncaught typeerror cannot read property name of undefined cons...

巨集也可以有返回值

一直是在使用c語言寫程式,而且是嵌入式上的開發。針動硬體的開發,不可避免的要使用巨集。但長期以來一直沒有解決的問題的是,如何使用巨集來代替一段函式的功能,而且還能返回乙個值呢?近幾天在做jos的實驗,發現其有對巨集的使用非常的巧妙。感嘆一下,原來巨集也可以這個樣了 1 include 2 3 def...