面試的時候你可能碰到面試官設(shè)的各種坑:不止喜歡問你iOS開發(fā)的一些特性和方法蒋得,更喜歡喜歡問你這些特性及方法你覺得它是怎么實現(xiàn)的?你覺得蘋果公司為什么要這樣設(shè)計?
也許面試官自己也沒自己實現(xiàn)過,畢竟有些東西蘋果為什么這樣設(shè)計姜胖,若不是蘋果公司的工程師無法知道。
但作為面試者淀散,這個些問題正是拉開差距的最好辦法:不一定要你親手用C去重現(xiàn)蘋果的機制右莱,但可以談?wù)勀愕囊娊夂涂捶ㄑ料恰K裕@一塊最好有個準(zhǔn)備慢蜓。
1. 用法實踐篇
一般亚再,會問你怎么實現(xiàn)某個模塊,用過哪些API晨抡,介紹下他們的用法氛悬。
1.1 你以前的項目架構(gòu)是怎樣的?
- 我用的MVVM耘柱,相對于傳統(tǒng)的MVC如捅,主要區(qū)別就是把網(wǎng)絡(luò)請求和業(yè)務(wù)層放到ViewModel里面了。
- 相對于普通博客介紹的
View<->ViewModel <->Model
调煎,其實更靠譜的理解是View <-> C <-> ViewModel <->Model
镜遣,把Controller加進去,更好的理解士袄。
- 然后悲关,為了讓View和ViewModel之間能夠有比較松散的綁定關(guān)系,于是我們使用ReactiveCocoa娄柳,KVO寓辱,Notification,block西土,delegate和target-action都可以用來做數(shù)據(jù)通信讶舰,從而來實現(xiàn)綁定,但都不如ReactiveCocoa提供的RACSignal來的優(yōu)雅需了,如果不用ReactiveCocoa,綁定關(guān)系可能就做不到那么松散那么好般甲,但并不影響它還是MVVM肋乍。
- 這里推薦一個MVVM基礎(chǔ)框架:https://github.com/foxsofter/LPDMvvmKit。
1.2 你是如何數(shù)據(jù)建模的敷存?
- 普通的辦法就是建一個基類比如BaseModel墓造,里面寫好一些初始化的方法,然后新建一個子類比如UserModel锚烦,里面寫好一些跟后臺對應(yīng)的字段觅闽,用它來接收數(shù)據(jù)或者保存數(shù)據(jù)。這一塊可參考:http://www.reibang.com/p/923404fcd2f2
- 還有一種辦法涮俄,就是封裝一個功能蛉拙,根據(jù)網(wǎng)絡(luò)請求返回來的JSON數(shù)據(jù)自動生成Model文件,當(dāng)然也提供特許字段的處理彻亲,比如
id
字段孕锄。它的缺點就是如果接口的JSON的數(shù)據(jù)是動態(tài)可變的吮廉,還是需要手動調(diào)整補充。這個可參考:https://blog.csdn.net/lg767201403/article/details/78675788 - 當(dāng)然畸肆,還有一種辦法宦芦,就是有個軟件叫JSONExport,可以實現(xiàn)上面封裝的那個功能轴脐,不過這種方法生成的更慢调卑。
1.3 你怎么實現(xiàn)字典轉(zhuǎn)模型的?
- 我原來的老工程里面用的是MJExtesion大咱,它的兼容性更高恬涧。當(dāng)然JSON層數(shù)不多的時候,我也會自己實現(xiàn)字典轉(zhuǎn)模型徽级,主要利用兩個API:
- (void)setValuesForKeysWithDictionary:(NSDictionary<NSString *,id> *)keyedValues;
和
- (void)setValue:(id)value forUndefinedKey:(NSString *)key{}
當(dāng)然气破,還有YYModel也可是實現(xiàn)字典轉(zhuǎn)模型,它的效率更快餐抢,關(guān)于這兩個的性能對比研究现使,可查閱http://www.reibang.com/p/ef3baf1c9463。
關(guān)于自己手動實現(xiàn)字典轉(zhuǎn)模型的原理旷痕,就是利用runtime+kvc碳锈,關(guān)于這一塊的研究,可查閱讀者的另外一篇http://www.reibang.com/p/885b65688b96欺抗。
1.4 你用過哪些動畫效果售碳?
- 最基本的就是UIView動畫了,不涉及任何CAAnimationtion提供的API绞呈,這個就包括了兩類frame動畫(涉及一些frame, bounds, center的改變)贸人,transform動畫。關(guān)于它的取值可以這樣:
imageContainView.frame = CGRectMake(80, 80, 200, 200);
- frame動畫基本利用的屬性就是UIView的
.frame
佃声,.bounds
艺智,.center
屬性。 - transform動畫利用的就是UIView的
.transform
屬性圾亏。至于它的取值可以類似如下這樣十拣,只要CGAffineTransform類型即可。
self.redView.transform = CGAffineTransformTranslate(self.redView.transform, 0, 0);
self.redView.transform = CGAffineTransformMakeRotation(M_PI);
self.redView.transform = CGAffineTransformMakeScale(1.5, 1.5);
- 當(dāng)涉及一些frame, bounds, center的改變或是形變的時候其實可以用 transform方式 來取代 frame方式志鹃。
- UIView動畫基本的語法形式就是兩種夭问,一個是UIView的begin --- commit,一個是UIView的animations block了曹铃。
- 再就是直接利用核心動畫CAAnimation及其子類的API了缰趋,包括基礎(chǔ)動畫,組動畫,轉(zhuǎn)場動畫埠胖,關(guān)鍵幀動畫糠溜,形變動畫。這種動畫的基本形式就是新建一個CAAnimation子類例如
CAKeyframeAnimation
直撤,然后向animatedView.layer視圖添加動畫效果
/**
* 抖動效果
*/
-(void)shakeAnimation{
CAKeyframeAnimation *anima = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation"];//在這里@"transform.rotation"==@"transform.rotation.z"
NSValue *value1 = [NSNumber numberWithFloat:-M_PI/180*4];
NSValue *value2 = [NSNumber numberWithFloat:M_PI/180*4];
NSValue *value3 = [NSNumber numberWithFloat:-M_PI/180*4];
anima.values = @[value1,value2,value3];
anima.repeatCount = MAXFLOAT;
[_demoView.layer addAnimation:anima forKey:@"shakeAnimation"];
}
- CG動畫非竿,比如我實現(xiàn)過一個類似芝麻分半圓形動畫的效果。這個動畫中谋竖,色彩漸變是通過
CAGradientLayer
實現(xiàn)的红柱,設(shè)置好參數(shù)后,設(shè)置它的蒙層即可蓖乘,例如gradientLayer.mask = self.graView.layer;
锤悄。關(guān)于,CG繪制的具體代碼嘉抒,可參考如下: