作者uranusjr (←這人是超級笨蛋)
看板MacDev
標題Re: alloc和init 的指令
時間Sat Jul 12 22:20:40 2014
※ 引述《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]);
--
「我最想要的同伴嘛,首先是要笑口常開,其次是我們能永遠不會發生誤會。
如果這些都能辦到的話,嗯,如果他是世界上第一流的橋手,也還不錯。」
-- 班尼多‧加羅素,前義大利藍隊成員
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 218.161.94.175
※ 文章網址: http://www.ptt.cc/bbs/MacDev/M.1405174842.A.363.html
※ 編輯: uranusjr (218.161.94.175), 07/12/2014 22:21:52
推 tu1119:剛好也有這問題!感謝啦! 07/13 08:42
推 chlorine:學到了 謝謝,非常感謝y 07/14 06:08
推 chlorine:上網看了一下,發現這是obc特殊的規則,alloc後要init 07/14 20:40
推 Blueshiva:其實alloc作用上等同於malloc,而init則是類似建構子 07/14 23:03
→ Blueshiva:畢竟ObjC是建構在C之上,物件的初始化不像C++寫在一起 07/14 23:04
推 Killercat:其實直接說他就是C的malloc就可以了 XD 07/15 11:01
→ Killercat:阿阿我眼殘沒看到你的第一行 當我沒說 XD 07/15 11:02