iOS面試題----實(shí)踐向

前言

很多人都說(shuō)熟悉UIKit复濒,那對(duì)于常見(jiàn)的API是否熟悉筷弦?
多線(xiàn)程是前端經(jīng)久不衰的考點(diǎn)幔妨。
大家對(duì)于Block的weak-strong dance都耳熟能詳闻镶,是否清楚知道每一個(gè)引用背后的持有者斥滤,以及對(duì)象的具體釋放時(shí)機(jī)将鸵?
來(lái)試試這4道精挑細(xì)選的題目。

正文

題目1佑颇、UIImage相關(guān)

看下面一段代碼顶掉,
保存到相冊(cè)的是什么?(從格式挑胸、形狀去描述)

- (void)testUIImage {
    UIImage *testImage;
    UIGraphicsBeginImageContext(CGSizeMake(50, 50));
    UIView *testView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];
    testView.backgroundColor = [UIColor redColor];
    testView.layer.cornerRadius = 25;
    testView.layer.masksToBounds = YES;
    [testView.layer renderInContext:UIGraphicsGetCurrentContext()];
    testImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    [[[ALAssetsLibrary alloc] init] writeImageToSavedPhotosAlbum:testImage.CGImage metadata:nil completionBlock:nil];
}

題目2痒筒、URL相關(guān)

看下面一段代碼,
寫(xiě)下三行Log的輸出茬贵,并解釋下URL是什么簿透。

- (void)testUrl {
    NSString *path = @"https://www.baidu.com/";
    NSString *path2 = @"http://fanyi.baidu.com/translate?query=#auto/zh/";
    NSString *path3 = @"http://fanyi.baidu.com/translate?query=#zh/en/測(cè)試";
    NSURL *url = [NSURL URLWithString:path];
    NSURL *url2 = [NSURL URLWithString:path2];
    NSURL *url3 = [NSURL URLWithString:path3];

    NSLog(@"%@", url);
    NSLog(@"%@", url2);
    NSLog(@"%@", url3);
}

題目3、線(xiàn)程相關(guān)

看下面一段代碼解藻,
寫(xiě)下Log的輸出老充,并解釋為什么。

- (void)viewDidLoad {
    [super viewDidLoad];
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"before perform");
        [self performSelector:@selector(printLog) withObject:nil afterDelay:0];
        NSLog(@"after perform");
    });
}
- (void)printLog {
    NSLog(@"printLog");
}

題目4螟左、內(nèi)存相關(guān)(簡(jiǎn)友們提醒啡浊,不要用系統(tǒng)的addSubviewremoveFromSuperView路狮,減少干擾項(xiàng))

看下面兩段代碼虫啥,
ViewController的代碼如下


@interface ViewController () <LYButtonDelegate>

@end

@implementation ViewController
{
    LYButton *testBtn;
    LYButton *testBtn2;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    testBtn = [[LYButton alloc] init];
    testBtn.delegate = self;
    [testBtn test];
    
    testBtn2 = [[LYButton alloc] init];
    testBtn2.delegate = self;
    [testBtn2 test2];
}

- (void)onRemove:(LYButton *)btn {
    if (testBtn == btn) {
        testBtn = nil;
    }
    if (testBtn2 == btn) {
        testBtn2 = nil;
    }
}


LYButton的代碼如下


@class LYButton;
@protocol LYButtonDelegate
- (void)onRemove:(LYButton *)btn;
@end


@implementation LYButton

- (void)test {
    [self.delegate onRemove:self];
    NSLog(@"%@", (self == nil) ? @"YES" : @"NO");
}

- (void)test2 {
    __weak typeof (LYButton *) weakSelf = self;
    dispatch_async(dispatch_get_main_queue(), ^{
        [weakSelf.delegate onRemove:weakSelf];
        NSLog(@"%@", (weakSelf == nil) ? @"YES" : @"NO");
        NSLog(@"end");
    });
}

@end

寫(xiě)下Log的輸出蔚约,并解釋為什么奄妨。

答案

題目1

考察點(diǎn):對(duì)常見(jiàn)UI操作、圖片格式的了解苹祟。
內(nèi)存中的testImage是非壓縮的格式砸抛,保存到相冊(cè)可以使用png或者jpeg格式。
-writeImageToSavedPhotosAlbum:接口默認(rèn)用的jpeg的格式树枫,如果保存png直焙,需要將圖片轉(zhuǎn)成NSData,然后再保存砂轻。
testView的操作是繪制圓角按鈕奔誓,然后用layer的renderInContext繪制到Context中;

結(jié)果圖

題目2

考察點(diǎn):對(duì)API的-URLWithString:了解,本質(zhì)的知識(shí)點(diǎn)是URL encode厨喂。
常見(jiàn)的錯(cuò)誤是在get參數(shù)添加中文和措,但是沒(méi)有重新編碼(也叫轉(zhuǎn)義),導(dǎo)致NSURL初始化失敗蜕煌。
正確的做法是調(diào)用NSString的(NSString *)stringByAddingPercentEscapesUsingEncoding:(NSStringEncoding)encoding方法派阱。

URL:Uniform Resource Locator,統(tǒng)一資源定位符斜纪,用的是ASCII編碼贫母。

題目3

考察點(diǎn):GCD并發(fā)隊(duì)列實(shí)現(xiàn)機(jī)制,以及performSelector的實(shí)現(xiàn)原理以及runloop了解盒刚。
上面這段代碼腺劣,只會(huì)打印before performafter perform,不會(huì)打印printLog因块。
原因:
1誓酒、GCD默認(rèn)的全局并發(fā)隊(duì)列,在并發(fā)執(zhí)行任務(wù)的時(shí)候贮聂,會(huì)從線(xiàn)程池獲取可執(zhí)行任務(wù)的線(xiàn)程(如果沒(méi)有就阻塞)靠柑。
2、performSelector的原理是設(shè)置一個(gè)timer到當(dāng)前線(xiàn)程Runloop吓懈,并且是NSDefaultRunLoopMode歼冰;
3、非主線(xiàn)程的runloop默認(rèn)是不啟用耻警;

進(jìn)階問(wèn)題:加一行代碼使得printLog能正常打印隔嫡。

題目4

考察點(diǎn):內(nèi)存的引用計(jì)數(shù)。
test1中甘穿,onRemove執(zhí)行之前腮恩,有-testBtn-test1温兼、self.view三個(gè)地方持有強(qiáng)引用秸滴,到打印log的時(shí)候兩個(gè)地方的強(qiáng)引用;
test2中募判,在block中強(qiáng)引用了weakSelf荡含,當(dāng)block執(zhí)行的時(shí)候,testBtn和test2的兩個(gè)引用都已經(jīng)釋放届垫,當(dāng)執(zhí)行完onRemove之后释液,最后一個(gè)引用也釋放,會(huì)立刻執(zhí)行dealloc方法装处,weakSelf被置為nil(weak指針的用法就是在對(duì)象被回收后變成nil)误债,故而Log輸出YES;

類(lèi)似,在UIButton的onClick:回調(diào)方法中寝蹈,button類(lèi)的self不僅會(huì)被StackThread持有糟袁,還會(huì)被main thread dispatch持有(系統(tǒng)分發(fā)點(diǎn)擊事件)。

總結(jié)

做題是一個(gè)有意思的過(guò)程躺盛,短時(shí)間的思考并得到對(duì)or錯(cuò)的回饋项戴,非常適合人腦的學(xué)習(xí)模式。
希望這幾道題能有所幫助槽惫。如果錯(cuò)誤周叮,請(qǐng)斧正。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末界斜,一起剝皮案震驚了整個(gè)濱河市仿耽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌各薇,老刑警劉巖项贺,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異峭判,居然都是意外死亡开缎,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)林螃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)奕删,“玉大人,你說(shuō)我怎么就攤上這事疗认⊥瓴校” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵横漏,是天一觀的道長(zhǎng)谨设。 經(jīng)常有香客問(wèn)我,道長(zhǎng)缎浇,這世上最難降的妖魔是什么扎拣? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮华畏,結(jié)果婚禮上鹏秋,老公的妹妹穿的比我還像新娘。我一直安慰自己亡笑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布横朋。 她就那樣靜靜地躺著仑乌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晰甚,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天衙传,我揣著相機(jī)與錄音,去河邊找鬼厕九。 笑死蓖捶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的扁远。 我是一名探鬼主播俊鱼,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼畅买!你這毒婦竟也來(lái)了并闲?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤谷羞,失蹤者是張志新(化名)和其女友劉穎帝火,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體湃缎,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡犀填,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嗓违。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宏浩。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖靠瞎,靈堂內(nèi)的尸體忽然破棺而出比庄,到底是詐尸還是另有隱情,我是刑警寧澤乏盐,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布佳窑,位于F島的核電站,受9級(jí)特大地震影響父能,放射性物質(zhì)發(fā)生泄漏神凑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一何吝、第九天 我趴在偏房一處隱蔽的房頂上張望溉委。 院中可真熱鬧,春花似錦爱榕、人聲如沸瓣喊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)藻三。三九已至洪橘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間棵帽,已是汗流浹背熄求。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留逗概,地道東北人弟晚。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像逾苫,于是被迫代替她去往敵國(guó)和親卿城。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1隶垮,NSObject中description屬性的意義藻雪,它可以重寫(xiě)嗎?答案:每當(dāng) NSLog(@"")函數(shù)中出現(xiàn) ...
    eightzg閱讀 4,144評(píng)論 2 19
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類(lèi)相關(guān)的語(yǔ)法狸吞,內(nèi)部類(lèi)的語(yǔ)法勉耀,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法蹋偏,線(xiàn)程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,639評(píng)論 18 399
  • *面試心聲:其實(shí)這些題本人都沒(méi)怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來(lái)就是把...
    Dove_iOS閱讀 27,146評(píng)論 30 470
  • 一切的不成功便斥,都來(lái)自于你內(nèi)心阻礙你的恐懼, 來(lái)源于你內(nèi)心的不自信威始。 很多人把自己的人生演繹成了?做繭自縛?的過(guò)程枢纠。...
    和諧環(huán)境閱讀 190評(píng)論 0 0
  • 如果記憶是風(fēng) | 目錄 上一章 | 第二十六章 第二十七章 大結(jié)局 我又去了落星涯,如今的落星涯天帝有派天兵把守黎棠,...
    辰小夕閱讀 511評(píng)論 14 26