MacDev 板


LINE

※ 引述《uranusjr (←這人是超級笨蛋)》之銘言:
1F:推 chlorine:上網看了一下,發現這是obc特殊的規則,alloc後要init 07/14 20:40
2F:推 Blueshiva:其實alloc作用上等同於malloc,而init則是類似建構子 07/14 23:03
3F:→ Blueshiva:畢竟ObjC是建構在C之上,物件的初始化不像C++寫在一起 07/14 23:04
說這是 Objective-C 特殊的規則其實不太對 因為這是物件導向語言共通的規則, 只是 Objective-C 的表現比較 explicit 絕大多數的類似語言都有同樣的做法 例如 Python 的物件建立其實也有 __new__ 和 __init__ 兩個步驟 只是一般會用特殊語法 instance = Class() 一次做掉 但事實上它背後仍然是呼叫 allocator + inistializer 的形式 其實這就和 NSObject 的 +new method 差不多 (不知道有多少人知道這個 method) 只是 Python 允許你換掉 method 參數 所以可以用一個語法自動做完, 不需要像 Objective-C 分兩次 即使是 C++, 其實狀況還是一樣 雖然一般的做法都是把 allocation 和 initialization 一起放在 contructor 但是在有繼承的狀況下, constructor 其實沒辦法取代 initializer 例如 C++ 不能在 constructor 呼叫 virtual functions 因為在子類別的 allocation 完成之前無法使用 vtable 其他語言也會有各自的 quirks 讓它們需要把 initializer 獨立出來 相對地, Objective-C 因為分兩個步驟, 就不會有這個問題 因為在 initializer 執行時已經保證 allocation 完成 所以可以安全使用任何子類別的複寫 總之 allocator 與 initializer 分開不是 Objective-C 的專利 而是物件導向語言在底層實作必要的設計 只是不是每個語言都像 Objective-C 那麼赤裸裸把它秀給你看而已 -- Les grandes et les meilleurs tone from "Zadok the Priest" Eine grosse stattliche Veranstaltung by F. Handel THE MAIN EVENT! These are the men Sie sind die Besten "Champions League" by Tony Britten THESE ARE THE CHAMPIONS! --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 218.161.94.175
※ 文章網址: http://webptt.com/m.aspx?n=bbs/MacDev/M.1405352995.A.DD3.html ※ 編輯: uranusjr (218.161.94.175), 07/14/2014 23:57:42
4F:→ Killercat:我其實都用new耶 幹嘛用alloc自虐? XD 07/15 11:02
5F:推 Blueshiva:嗯,我的講法其實是針對有C++經驗的人來講的,詳細講起 07/15 11:08
6F:→ Blueshiva:的確就像你說的,其實alloc+init才會等同於建構子 07/15 11:10
7F:→ Blueshiva:不過考量到ObjC設計的時候其實根本沒有C++,ObjC也是整 07/15 11:11
8F:→ Blueshiva:個用C組出來,我想的時候會把它用struct來想 07/15 11:13
9F:推 chlorine:一個程式,各自表述囉,我的書上是這樣教的呀 07/15 23:07
10F:推 Killercat:其實我問過一些同僚,因為很多人會override init 07/16 03:15
11F:→ Killercat:用[[AClass alloc]init]會比較讓人真的有call到init的 07/16 03:15
12F:→ Killercat:安心感 [AClass new]總覺得怕init沒跑到(他真的這樣講) 07/16 03:16
13F:推 Blueshiva:不過init也有很多種,常見的如initWithFrame,用new的話 07/16 14:25
14F:→ Blueshiva:應該就不會呼叫到? 07/16 14:25
15F:→ Killercat:這可能要試一下,不過這很妙的是,google查NSView.m 07/16 16:55
16F:→ Killercat:可以發現幾份實作,openstep的會呼叫[super init]而其他 07/16 16:56
17F:→ Killercat:實作則否。但是的確,所有實作都不會呼叫[self init] 07/16 16:56
18F:→ Killercat:所以你這句話這樣看來應該是對的... 07/16 16:57
19F:→ Killercat:大多數的NSView -(id)init實作都是 07/16 16:57
20F:→ Killercat:[self initWithFrame: NSZeroRect] 07/16 16:57
21F:→ Killercat:少部分則是反過來呼叫,這真的也滿妙的... 07/16 16:58
22F:→ uranusjr:阿婆的文件說 -initWithFrame: 是 designated initialzer 07/16 17:49
23F:→ uranusjr:所以讓 -init 呼叫 -initWithFrame: 才是對的 07/16 17:49
24F:→ uranusjr:當然實務上隨便搞也沒人阻止你, 只是蘋果應該不是這樣做 07/16 17:50
25F:→ Killercat:這其實有些問題 因為NSObject沒有initWithFrame 07/16 18:19
26F:→ Killercat:不過既然apple這樣講 就跟著這樣做吧... :D 07/16 18:19
27F:推 Blueshiva:文件上是說NSView的designated initialzer是 07/16 23:49
28F:→ Blueshiva:-initWithFrame,而且有說這是特殊狀況(應該是說相對於 07/16 23:49
29F:→ Blueshiva:其他種類的class),有點類似C++中建構子多載的情況吧 07/16 23:51
30F:→ Blueshiva:針對不同用途的物件,有個最終的initializer,其餘的就 07/16 23:52
31F:→ Blueshiva:是一直丟預設值往後呼叫 07/16 23:52







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BabyMother站內搜尋

TOP