[問題] 為什麼NSMutableArray可有不同class物件

作者: bbbbbird (Free!)   2015-01-05 15:28:15
感謝各位大大撥冗查看小弟的笨問題
小弟那天面試一間iOS開發者,之前就有聽說老闆本身寫iOS神強
後來老闆進來聊一聊以後,的確問了一些技術問題
大部份都能說個輪廓出來,就是有一題我直接說我不知道。。。
連想都沒想過
就是如題『為什麼Obj-C的Array可以同時contain多個型態的物件?』
回家google半天,大部份的說明也都是說可以有不同class物件在裡面
但是沒有人說過原理,為什麼C不行,Java不行
偏偏就是Obj-C可以咧。。。?
感謝各位大大的解答...^^
作者: Blueshiva (龍野南雲)   2015-01-05 15:34:00
ObjC所有的物件都是繼承自NSObject,所以NSArray只要檢查丟進來的東西是NSObject就可以存了。C要這樣搞也是可已,就是宣告一個type都是void的array就可以了
作者: bbbbbird (Free!)   2015-01-05 15:39:00
所以就是因為所有物件都繼承於NSObject...?XDDD原來這麼簡單,我好笨喔,謝謝難怪沒人問!
作者: darktt (小朱)   2015-01-05 16:14:00
說NSObject的物件或是id物件都可以,id物件是抽象的物件
作者: bbbbbird (Free!)   2015-01-05 16:30:00
感謝各位大大的解說><
作者: uranusjr (←這人是超級笨蛋)   2015-01-05 17:52:00
@darktt 其實不一樣, id 不見得繼承自 NSObject並沒有規定 Objective-C class 一定要繼承 NSObject (只是慣例), 這點和 Java 不一樣
作者: darktt (小朱)   2015-01-05 22:13:00
我是有試過Root class,不過init的過程要自己完成就作罷所以一直無法驗證Root Class是否可以使用id做替代
作者: appleway (蘋果愛天空)   2015-01-06 00:35:00
id 是 typedef struct objc_object *id;
作者: uranusjr (←這人是超級笨蛋)   2015-01-06 00:36:00
我試過了, 只要有實作 retain 就可以被加入
作者: appleway (蘋果愛天空)   2015-01-06 00:36:00
例如NSProxy 跟block 就不是繼承NSObject,
作者: uranusjr (←這人是超級笨蛋)   2015-01-06 00:37:00
被移出需要實作 release, 其他一些功能需要其他 methods
作者: appleway (蘋果愛天空)   2015-01-06 00:37:00
不過 他們都是Objective C object
作者: howdiun (Howdiun)   2015-01-06 09:16:00
都可以吧
作者: ssccg (23)   2015-01-06 09:34:00
Java為什麼不行? 不就Object[] ?
作者: uranusjr (←這人是超級笨蛋)   2015-01-06 10:50:00
@ssccg 你在 Object[] 裡放 int 給我看(啊我發現這例子不好, NSArray 也不行 XD 算了)
作者: darktt (小朱)   2015-01-06 11:41:00
int是C type所以不行,不過在swift下就沒這個限制了
作者: manlike ( )   2015-01-06 11:58:00
int又不是物件, Java可以放Integer, Obj-C可以用NSNumber
作者: Blueshiva (龍野南雲)   2015-01-06 12:25:00
uranusjr馬上就發現啦,一直追這點幹嘛 XDD
作者: uranusjr (←這人是超級笨蛋)   2015-01-06 16:11:00
但我覺得 int 不是物件根本很腦殘, Objective-C 本來就疊床架屋就算了, Java 硬模仿 C++ 又學不像就很智障

Links booklink

Contact Us: admin [ a t ] ucptt.com