下面從第一題開始解答:
題目:1.object-c的類可以多重繼承麼?可以實現多個介面麼?category是什麼?重寫乙個類的方式用繼承好還是分類好?為什麼?
關於多繼承:
首先 object-c不能夠多繼承,類似下面**的這種方式是絕對通不過編譯的.當然,你也可以把nsstring前面的":"去掉再試試,呵呵!
那麼有沒有別的方式來替代呢?有,一種我們稱之為偽繼承,另一種我們可以通過ios中無處不在的@protocol委託方式來實現.
1.偽繼承
儘管再objtive-c中不提供多繼承,但它提供了另外一種解決方案,使物件可以響應在其它類中實現的訊息(別的語言中,一般叫方法,兩者無差別). 這種解決方案叫做訊息**,它可以使乙個類響應另外乙個類中實現的訊息。
在一般情況下,傳送乙個無法識別的訊息會產生乙個執行時的錯誤,導致應用程式崩潰,但是注意,在崩潰之前,iphone執行時物件為每個物件提供了第二次機會來處理訊息。捕捉到一條訊息後可以把它重定向到可以響應該訊息的物件。
這個功能完全通過訊息**來實現,傳送訊息給乙個無法處理該選擇器的物件時,這個選擇器就會被**給 forwardinvocation 方法.接收這條訊息的物件,用乙個nsinvocation的例項儲存原始的選擇器和被請求的引數.所以,我們可以覆蓋 forwardinvocation 方法,並把訊息**給另外乙個物件.
1.1 實現訊息**功能
在給程式新增訊息**功能以前,必須覆蓋兩個方法,即methodsignatureforselector: 和 forwardinvocation:。methodsignatureforselector:的作用在於為另乙個類實現的訊息建立乙個有效的方法簽名。forwardinvocation:將選擇器**給乙個真正實現了該訊息的物件.
例子:1.
1 - (nsmethodsignature*)methodsignatureforselector:(sel)selector2.2
1 - (void)forwardinvocation:(nsinvocation *)invocation3.呼叫2 9 }
1 car *mycar = [car car]; //解釋: 這裡借iphone開發秘籍的例子來說明, self.carinfo是乙個唯讀的nsstring物件,存在於car類中.例子中car例項是無法正確的為另外乙個物件(nsstring)實現的選擇器建立乙個有效的簽名。執行時當檢查到當前沒有有效的簽名,即進入該物件(這裡是mycar)的methodsignatureforselector:方法中,此時,將在這個方法中對每個偽繼承進行迭代並嘗試構建乙個有效的方法簽名的機會.例如**中,當mycar呼叫utf8string時,由於無法從當前物件中獲得訊息,轉入第二次機會捕捉訊息,首先進入methodsignatureforselector:方法,採用迭代的方式為當前被呼叫的方法建立乙個有效的簽名,得到簽名後,轉入forwardinvocation:方法對其呼叫的方法(utf8string)進行實現. forwardinvocation:中,首先獲得呼叫的方法(utf8string),判斷self.carinfo(乙個nsstring物件)能否響應該方法,如果可以,將呼叫utf8string物件的目標轉換為self.carinfo物件. 這樣 ,我們就實現了多繼承,呵呵!!car為乙個類
2 [(nsstring *)mycar utf8string] //
這裡呼叫nsstring中的utf8string方,注意car中並未實現該方法
2.委託
在ios中委託通過一種@protocol的方式實現,所以又稱為協議.協議是多個類共享的乙個方法列表,在協議中所列出的方法沒有響應的實現,由其它人來實現.這叫好比我想買個手機,所以我有個buyiphone 方法,但是我不知道誰那買手機,所以把這個需求發布出去(比如公布在**上),如果有賣手機的商人(也就是說他能實現buyiphone這個方法)看到,他就會接受我的委託,(在商人自己的類中實現),那麼我的委託物件就指向了這個商人..當我要買手機的時候,直接找他就行了.
例如:
@protocol mydelegate**中宣告了乙個協議 名叫mydelegate,在其中有乙個buyiphone方法,即乙個委託項。當我要購買手機的時候只需要通過delegate 呼叫 buyiphone方法即可.-(void)buyiphone:(nsstring *)iphonetype money:(nsstring *)money;
@end
@inte***ce my : nsobject
@property(assign,nonatomic)id
delegate;
@end
如下:
-(void)willbuy我不必關心誰現實了這一委託,只要實現了這個委託的類,並且buyiphone是宣告的委託中必須實現的方法,那麼就一定能夠得到結果.
例如:商人類實現了這一委託(用表示實現)
#import然後在 @implementation business 中呼叫 buyiphone方法#import
"my.h
"@inte***ce business : nsobject@end
#import"business.h
"@implementation business
-(void)buyiphone:(nsstring *)iphonetype money:(nsstring *)money
@end
IOS面試題詳解 二
面試題 下面從第一題開始解答 題目 1.object c的類可以多重繼承麼?可以實現多個介面麼?category是什麼?重寫乙個類的方式用繼承好還是分類好?為什麼?關於多繼承 首先 object c不能夠多繼承,類似下面 的這種方式是絕對通不過編譯的.當然,你也可以把nsstring前面的 去掉再試...
iOS面試題(二)
1.self.和self的區別?id,nil代表什麼?2.nsdate如何格式化輸出?對於格式是否有要求?例項化乙個nsdateformatter物件nsdateformatter dateformatter nsdateformatter alloc init 設定時間格式,這裡可以設定成自己需要...
iOS面試題總結 (二)
動態繫結 程式直到執行時才知道執行哪個方法,動態繫結需要做的,即就是在例項所屬類確定後,將某些屬性和方法繫結到例項上。sel是類方法方法的指標,他就相當於c語言中的中函式指標。sel class func selector oc類裡面的方法都是被轉換成sel變數進行儲存的,當類宣告乙個物件,物件呼叫...