看板 MacDev 關於我們 聯絡資訊
※ 引述《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