Re: alloc和init 的指令

作者: uranusjr (←這人是超級笨蛋)   2014-07-12 22:20:40
※ 引述《chlorine (Chlorine)》之銘言:
: 各位前輩好,新人有很基本的觀念不懂
: 關於 宣告方法後,使用 「*」指定一個reference
: 照著課本的方法
: 我需要先用 [Object alloc] 和 [Object init]
: 我先寫成兩行,如果把alloc 註解化,程式不會動作
: 但是如果把init註解化,程式還是可以跑出原來的設定
: 請問init為何一定要呢?我把他註解化了,還是可以看到原來的數字呀
: (註:課本的範例程式是分數顯示,所以很簡單)
: 謝謝解答
Objective-C 的物件初始化分成兩階段
alloc 分配 (allocate) 記憶體並建立物件基本格式
init 初始化 (initialize) 物件內容
沒錯, 即使你不初始化, 物件還是會正確存在
但是如果該物件裡有一些需要在被生成時指定的值, 沒有 init 就無法正確初始化
考慮以下的 class
@interface Answer : NSObject
{
int _value;
}
- (int)value;
@end
@implementation Answer
- (id)init
{
self = [super init];
if (!self)
return self;
_value = 42;
return self;
}
- (int)value
{
return _value;
}
@end
若你執行 Answer *answer = [Answer alloc];
則 answer 會是一個完整的 Objective-C 物件
但如果你試圖讀取它的 value
NSLog(@"%d", [answer value]);
你會發現這個值是 0, 不是正解
這個物件必須要初始化才能被使用
answer = [answer init];
NSLog(@"%d", [answer value]); // 這會正確印出 42
回到你一開始的問題, 為什麼老師要你必須 init?
雖然 alloc 可以得到完整的 Objective-C 物件
但這個物件在被初始化前並不一定擁有它必要的資訊
而由於我們日常使用的類別中, 絕大多數(甚至全部)都需要初始化才能正確運作
所以一般會建議直接養成習慣, 在生成 Objective-C 物件時順便呼叫 init
Answer *answer = [[Answer alloc] init];
NSLog(@"%d", [answer value]);
作者: tu1119 (拔剌)   2014-07-13 08:42:00
剛好也有這問題!感謝啦!
作者: chlorine (綠)   2014-07-14 06:08:00
學到了 謝謝,非常感謝y
作者: Blueshiva (龍野南雲)   2014-07-14 23:03:00
其實alloc作用上等同於malloc,而init則是類似建構子畢竟ObjC是建構在C之上,物件的初始化不像C++寫在一起
作者: Killercat (殺人貓™)   2014-07-15 11:01:00
其實直接說他就是C的malloc就可以了 XD阿阿我眼殘沒看到你的第一行 當我沒說 XD

Links booklink

Contact Us: admin [ a t ] ucptt.com