Re: alloc和init 的指令

看板MacDev作者 (←這人是超級笨蛋)時間11年前 (2014/07/12 22:20), 11年前編輯推噓5(502)
留言7則, 4人參與, 最新討論串2/4 (看更多)
※ 引述《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

07/13 08:42, , 1F
剛好也有這問題!感謝啦!
07/13 08:42, 1F

07/14 06:08, , 2F
學到了 謝謝,非常感謝y
07/14 06:08, 2F

07/14 20:40, , 3F
上網看了一下,發現這是obc特殊的規則,alloc後要init
07/14 20:40, 3F

07/14 23:03, , 4F
其實alloc作用上等同於malloc,而init則是類似建構子
07/14 23:03, 4F

07/14 23:04, , 5F
畢竟ObjC是建構在C之上,物件的初始化不像C++寫在一起
07/14 23:04, 5F

07/15 11:01, , 6F
其實直接說他就是C的malloc就可以了 XD
07/15 11:01, 6F

07/15 11:02, , 7F
阿阿我眼殘沒看到你的第一行 當我沒說 XD
07/15 11:02, 7F
文章代碼(AID): #1JmKGwDZ (MacDev)
討論串 (同標題文章)
本文引述了以下文章的的內容:
以下文章回應了本文
完整討論串 (本文為第 2 之 4 篇):
文章代碼(AID): #1JmKGwDZ (MacDev)