前段時(shí)間辭職了,因?yàn)楣镜臍夥帐值膲阂盅槊恚夜緵]有一個(gè)合格的產(chǎn)品經(jīng)理顶吮,沒有明確的產(chǎn)品路線,完全是走一步看一步粪薛,幾乎除了研發(fā)全是副總悴了,而且每此投資人員一來公司,App肯定會(huì)有改動(dòng),當(dāng)然有大有小湃交,每次剛剛做好的東西瞬間就會(huì)改掉熟空,有得時(shí)候一天會(huì)改七八次。在這樣的沒有明確目標(biāo)的公司做一款產(chǎn)品搞莺,我絲毫感覺不到希望息罗,對(duì)公司的理念完全失去了興趣。在這個(gè)公司編程變成了一件枯燥的事情才沧,這根本不是我想要的生活阱当,我不想干了,重要的是失去了感覺和編程的樂趣糜工。(真的是這樣弊添,樂趣的確很重要,喬布斯都這么說)捌木。
知之者不如好之者油坝,好之者不如樂之者。五千年前孔子已經(jīng)道出了成功的境界之所在刨裆,當(dāng)你成為一名樂之者的時(shí)候澈圈,事實(shí)上已經(jīng)把工作當(dāng)成了玩,就像玩游戲打怪升級(jí)一樣帆啃,很有快感和成就感瞬女。當(dāng)你沉浸在一件事情的時(shí)候,你就很容易吧這件事情做好努潘,因?yàn)槟愕呐d趣在這件事情上诽偷,你樂意去完成它,即便有困難疯坤,我想你也樂意去解決报慕。
好的扯得有點(diǎn)遠(yuǎn)了,PS:哪位的公司愿意收留請(qǐng)私信我,下面我來貼出來我面試的時(shí)候遇到的面試題压怠。
第1題
@implementation Son : Father
- (id)init{ self = [super init];
if (self) {
NSLog(@"%@", NSStringFromClass([self class]));
NSLog(@"%@", NSStringFromClass([super class]));
NSLog(@"%@",NSStringFromClass(self.superclass));
}
return self;
}
@end
//打印結(jié)果就是
Son
Son
Father
我來告訴大家為什么
當(dāng) 發(fā)送 class 消息 時(shí)不管是 self 還是 super 其消息主體依然是 self ,也就是說 self 和 super 指向的 是同一個(gè)對(duì)象眠冈。只是 查找方法的位置 區(qū)別,一個(gè)從本類菌瘫,一個(gè)從本類的超類蜗顽。
一般情況下 class 方法 只有在 根類 NSObject 中定義,極少情況有子類重寫 class 方法雨让,
所以 [self class] 和 [super class] 都是在 根類中 找方法實(shí)現(xiàn)雇盖, 消息接收主體 又都是 a
如果重寫可能會(huì)不一樣。
自然都打印出 Son
第2題
UIView宫患、UIWindow和CALayer的聯(lián)系和區(qū)別
UIView負(fù)責(zé)渲染矩形區(qū)域內(nèi)的內(nèi)容,為矩形區(qū)域添加動(dòng)畫,相應(yīng)區(qū)域的觸摸事件,布局, 和管理一個(gè)或多個(gè)子視圖,UIWindow是一個(gè)特殊的UIView,通常在一個(gè)程序中只有一個(gè)UIWindow,但可以手動(dòng)創(chuàng)建多個(gè)添加到程序中
UIWindow主要起三個(gè)作用:
1刊懈、作為容器,包含程序所有要顯示的視圖
2、傳遞觸摸消息到其他的UIView或其他對(duì)象
3娃闲、與UIViewController協(xié)同工作,完成設(shè)備方向旋轉(zhuǎn)的支持
CALayer是繪制內(nèi)容的,不處理事件響應(yīng),與UIView是相互依賴的,依賴于UIView來顯示繪制內(nèi)容,UIView依賴于CALayer來提供內(nèi)容```
######第3題
#import虚汛、@class、#include聯(lián)系和區(qū)別皇帮?
通常引用一個(gè)類有兩種辦法:
一種是通過#import方式引入卷哩;另一種是通過@class引入;
這兩種的方式的區(qū)別在于:
1属拾、#import方式會(huì)包含被引用類的所有信息将谊,包括被引用類的變量和方法;@class方式只是告訴編譯器在A.h文件中 B *b 只是類的聲明渐白,具體這個(gè)類里有什么信息尊浓,這里不需要知道,等實(shí)現(xiàn)文件中真正要用到時(shí)纯衍,才會(huì)真正去查看B類中信息栋齿;
2、使用@class方式由于只需要只要被引用類(B類)的名稱就可以了襟诸,而在實(shí)現(xiàn)類由于要用到被引用類中的實(shí)體變量和方法瓦堵,所以需要使用#importl來包含被引用類的頭文件;
3歌亲、通過上面2點(diǎn)也很容易知道在編譯效率上菇用,如果有上百個(gè)頭文件都#import了同一 個(gè)文件,或者這些文件依次被#improt(A->B, B->C,C->D…),一旦最開始的頭文件稍有改動(dòng)陷揪,后面引用到這個(gè)文件的所有類都需要重新編譯一遍惋鸥,這樣的效率也是可想而知的,而相對(duì)來 講悍缠,使用@class方式就不會(huì)出現(xiàn)這種問題了揩慕;
由上可知,@class是放在interface中的扮休,只是在引用一個(gè)類迎卤,將這個(gè)被引用類作為一個(gè)類型,在實(shí)現(xiàn)文件中玷坠,如果需要引用到被引用類的實(shí)體變量或者方法時(shí)蜗搔,還需要使用#import方式引入被引用類。
預(yù)編譯指令
Objective-C:#import
C八堡,C++:#include
#import由gcc編譯器支持
在 Objective-C 中樟凄,#import 被當(dāng)成 #include 指令的改良版本來使用。除此之外兄渺,#import 確定一個(gè)文件只能被導(dǎo)入一次缝龄,這使你在遞歸包含中不會(huì)出現(xiàn)問題。
使用哪一個(gè)還是由你來決定。一般來說叔壤,在導(dǎo)入 Objective-C 頭文件的時(shí)候使用 #import瞎饲,包含 C 頭文件時(shí)使用 #include。比如:
#import比起#include的好處就是不會(huì)引起交叉編譯
######第4題
OC中的屬性修飾符炼绘,查看一下[博文](http://blog.sina.com.cn/s/blog_83b365f60102w70n.html)嗅战,寫的很清楚。
######第5題

相信很多人都遇到了這個(gè)問題了吧俺亮!哈哈驮捍,沒錯(cuò)我也遇到了,因?yàn)槭羌兛创a脚曾,沒有Xcode進(jìn)行實(shí)操东且,所以還是又辣么一點(diǎn)點(diǎn)小難度的。
其實(shí)個(gè)人感覺這段代碼并沒有什么太大的錯(cuò)誤本讥,只是考考你是不是處女座(換句話說就是考驗(yàn)?zāi)愕拇a規(guī)范)

這是我個(gè)人改的苇倡,可能每個(gè)人的變成習(xí)慣不一樣,所以答案也不唯一囤踩,這道題的初衷大概就是的窺視面試者的編程規(guī)范旨椒。
這里給出原因,我參考的[博客](http://ios.jobbole.com/82219/)
######第6題
試著定義一個(gè)block
typedef void(^selectRowAtIndex)(NSInteger index);
@property (nonatomic, copy)selectRowAtIndex handle;
//其實(shí)這些代碼要是用Xcode寫出來的話我相信有點(diǎn)經(jīng)驗(yàn)的都可以隨手寫出來堵漱,但是要是寫在紙上還是很惡心的一件事综慎,不是么?
反寫block:寫出下面代碼的Block的定義勤庐。
[UIView transitionWithView:self.view
duration:0.2
options:UIViewAnimationOptionTransitionFlipFromLeft
animations:^{ [[blueViewController view] removeFromSuperview]; [[self view] insertSubview:yellowViewController.view atIndex:0]; }
completion:NULL];
答案:
typedef void(^animations) (void);
typedef void(^completion) (BOOL finished);```
第7題
今天被餓了么的工程師問到了個(gè)問題示惊,自己覺得回答的不是很好,這里網(wǎng)上查了一下愉镰,做了相關(guān)的解釋米罚,下面貼出來
1、 類別(category)和繼承的區(qū)別丈探?
*類別:類別是對(duì)一個(gè)功能完備的類的一種補(bǔ)充录择,就像是一個(gè)東西的主要基本功能都完成了,可以用類別為這個(gè)類添加不同的組件碗降,使得這個(gè)類能夠適應(yīng)不同情況的需求隘竭。比如animal這個(gè)類,具有eat和run等方法讼渊,想給這個(gè)類添加一個(gè)bark的方法动看,可以用類別。
*繼承:多個(gè)類具有相同的實(shí)例變量和方法時(shí)爪幻,考慮用繼承菱皆。即子類可以繼承父類的相同特性须误。如animal具有年齡和體重兩個(gè)屬性,dog也具有年齡和體重兩 個(gè)屬性仇轻,dog可以繼承animal的這兩個(gè)屬性京痢,即為繼承。
共同點(diǎn):都是給一個(gè)類進(jìn)行擴(kuò)展
區(qū)別:
1.類別是對(duì)方法的擴(kuò)展拯田,不能添加成員變量历造。繼承可以在原來父類的成員變量的基礎(chǔ)上甩十,添加新的成員變量
2.類別只能添加新的方法船庇,不能修改和刪除原來的方法。繼承可以增加侣监、修改和刪除方法鸭轮。
3.類別不提倡對(duì)原有的方法進(jìn)行重載。繼承可以通過使用super對(duì)原來方法進(jìn)行重載橄霉。
4.類別可以被繼承窃爷,如果一個(gè)父類中定義了類別,那么其子類中也會(huì)繼承此類別姓蜂。
第8題
__block和__weak修飾符的區(qū)別
API Reference對(duì)__block變量修飾符有如下幾處解釋:
//A powerful feature of blocks is that they can modify
variables in the same lexical scope. You signal that a block
can modify a variable using the __block storage type
modifier.
//At function level are __block variables. These are mutable
within the block (and the enclosing scope) and are preserved
if any referencing block is copied to the heap.
大概意思?xì)w結(jié)出來就是兩點(diǎn):
1.__block對(duì)象在block中是可以被修改按厘、重新賦值的。
2.__block對(duì)象在block中不會(huì)被block強(qiáng)引用一次钱慢,從而不會(huì)出現(xiàn)循環(huán)引用問題逮京。
API Reference對(duì)__weak變量修飾符有如下幾處解釋:
__weak specifies a reference that does not keep the
referenced object alive. A weak reference is set to nil when
there are no strong references to the object.
使用了__weak修飾符的對(duì)象,作用等同于定義為weak的property束莫。自然不會(huì)導(dǎo)致循環(huán)引用問題懒棉,因?yàn)樘O果文檔已經(jīng)說的很清楚,當(dāng)原對(duì)象沒有任何強(qiáng)引用的時(shí)候览绿,弱引用指針也會(huì)被設(shè)置為nil策严。
因此,__block和__weak修飾符的區(qū)別其實(shí)是挺明顯的:
1.__block不管是ARC還是MRC模式下都可以使用饿敲,可以修飾對(duì)象妻导,還可以修飾基本數(shù)據(jù)類型。
2.__weak只能在ARC模式下使用怀各,也只能修飾對(duì)象(NSString)栗竖,不能修飾基本數(shù)據(jù)類型(int)。
3.__block對(duì)象可以在block中被重新賦值渠啤,__weak不可以狐肢。
PS:__unsafe_unretained修飾符可以被視為iOS SDK 4.3以前版本的__weak的替代品,不過不會(huì)被自動(dòng)置空為nil沥曹。所以盡可能不要使用這個(gè)修飾符份名。
第9題
OC有多繼承么碟联?沒有的話用什么代替竣贪?
其實(shí)第一問是廢話孽锥,為什么這么說惊科,因?yàn)楹苊黠@看出來這個(gè)問題的重點(diǎn)是后半句埠啃,所以O(shè)C是沒有多繼承的忱嘹。但是用什么代替呢怎栽?
我們都知道objective C不能像C++一樣支持多繼承俱饿,但是在OC的使用經(jīng)常會(huì)碰到需要使用多繼承的情況糟港。例如琉兜,ClassA中有methodA凯正,ClassB中methodB,而現(xiàn)在需要使用這兩個(gè)類中的方法豌蟋。如何按照C++的編程思路廊散,毫無疑問采用多繼承就搞定了,在OC就需要?jiǎng)觿?dòng)腦子了梧疲。
筆者最先想到的就是協(xié)議允睹,利用協(xié)議可以同時(shí)實(shí)現(xiàn)A + B;
其實(shí)我們?cè)趯W(xué)習(xí)設(shè)計(jì)模式的時(shí)候知道幌氮,多繼承的效率不高缭受,而且采用組合的模式可以完全代替繼承模式。那么该互,這種思路完全可以用在OC中實(shí)現(xiàn)多繼承(或許OC拋棄多繼承米者,就是強(qiáng)迫我們使用更高效的組合設(shè)計(jì)模式吧!)慢洋。上面這種方法是我百度到的塘雳,但是也未嘗不可,思路就是創(chuàng)建另一個(gè)ClassC 普筹,實(shí)現(xiàn)一個(gè)方法里面包含AB兩個(gè)方法败明。但是我覺得這樣太繁瑣。
其實(shí)每一次面試都是一次歷練太防,每一次面試都是一次考驗(yàn)妻顶,不管是哪方面,對(duì)于一個(gè)人的成長(zhǎng)都有益處的蜒车,就技術(shù)知識(shí)而言讳嘱,于我,每次都可以從面試的過程中學(xué)到新知識(shí)酿愧,亦或鞏固之前不確定的東西沥潭。一次面試讓自己發(fā)現(xiàn)很多之前沒有掌握好的東西,那么這次面試就是有價(jià)值的嬉挡,無論成功與否都是一次成長(zhǎng)的機(jī)會(huì)钝鸽。
歡迎大牛補(bǔ)充和指點(diǎn)汇恤。
歡迎關(guān)注我的微博和博客。