iOS面试现场,笔试提高题详解

现在已经不断有网友发我他们在面试中遇到的面试题,这是一位程序媛前面在面试中遇到的问题

前面两个过于基础,从提高题开始分享;个人见解,勿喷

持续关注:iOS开发_小贤,持续输出各大公司iOS面试系列文章,欢迎广大程序猿找我投稿面试中碰到的面试题,我会给你一份我的见解和答案,顺便给大家推荐一个iOS进阶学习群:763164022!群内会有几百道最新的面试题以及答案分享!欢迎大家入驻

题一:what is purpose ofdelegates?

代理的?的是改变或传递控制链。允许?个类在某些特定时刻通知到其他类,而不需要获取到那些类的指针??梢约跎倏蚣芨丛佣?。

什么是代理?

代理是?种通?的设计模式,代理主要由三部分组成

?、协议:用来指定代理双方可以做什么,必须做什么;

二、代理:根据指定的协议,完成委托?需要实现的功能;

三、委托:根据指定的协议,指定代理去完成什么功能。

代理的实现流程

在iOS中代理的本质就是代理对象内存的传递和操作,我们在委托类设置代理对象后,实际上只是?一个id类型的指针将代理对象进?了一个弱引?。委托?让代理方执?操作,实际上是在委托类中向这个id类型指针指向的对象发送消息,?这个id类型指针指向的对象,就是代理对象。

代理的内存管理

使?代理如果声明的不对,会造成循环引?的问题。?般会?weak修饰,?strong修饰会造成循环引?问题,?assign修饰会造成crash。

代理与其他iOS中消息传递的?式的对?

通知:在iOS中由通知中?进?消息接收和消息?播,是?种?对多的消息传递?式。

代理:是?种通?的设计模式,iOS中对代理?持的很好,由代理对象、委托者、协议三部分组成。

Block:iOS4.0中引?的?种回调?法,可以将回调处理代码直接写在block代码块中,看起来逻辑清晰代码整?。

target action:通过将对象传递到另?个类中,在另?个类中将该对象当做target的?式,来调?该对象?法,从内存?度来说和代理类似。

KVO:NSObject的Category-NSKeyValueObserving,通过属性监听的?式来监测某个值的变化,当值发?变化时调?KVO的回调?法。

代理与block的对?

1. 多个消息传递,应该使?delegate。在有多个消息传递时,?delegate实现更合适,看起来也更清晰。block就不太好了,这个时候block反而不便于维护,?且看起来?常臃肿,很别扭。例如UIKit的UITableView中有很多代理如果都换成block实现,会?比delegates难?好多。

2.一个委托对象的代理属性只能有?个代理对象,如果想要委托对象调?多个代理对象的回调应该用block。

3.单例对象最好不要?delegate。单例对象由于始终都只是同?个对象,如果使?delegate,就会造成delegate属性被重新赋值的问题,最终只能有一个对象可以正常响应代理?法。

4.代理更加?相过程,block则更面向结果。从设计模式的角度来说,代理更加面向过程,?block更加?向结果。

5.从性能上来说,block的性能消耗要略大于delegate,因为block会涉及到栈区向堆区拷?等操作,时间和空间上的消耗都?于代理。?代理只是定义了?个?法列表,在遵守协议对象的objc_protocol_list中添加?个节点,在运?时向遵守协议的对象发送消息即可

题二:Objective C中多重继承的实现机制。

什么是多继承?

假设C类要同时继承A类和B类,则称之为多继承。这种情况就是多继承。

oc中的“多继承”

其实Objective-C不支持多继承,由于消息机制名字查找发?在运?时?非编译时,很难解决多个基类可能导致的?义性问题。不过其实Objective-C 也?需?持多继承,我们可以找到如下?种间接实现多继承?的方法:

1. 通过组合实现“多继承”

2. 通过协议实现“多继承”

通过组合实现“多继承”

通过协议实现“多继承”

虽然OC在语法上禁?类使?多继承,但是却可以?协议来实现多继承。协议只能提供接?,而没有提供实现?式,如果只是想多继承基类的接?,那么遵守多协议?疑是最好的?法。

此?法缺点?较明显:需要修改两个?类,同时并不能调?两个?类的原??法,需要在?类中实现?法。

题三:简述Singleton的概念及并使用Objective C 写出相关代码。

Singleton: 单例模式。 简单来说, 就是保证在你不主动销毁这个单例对象的情况下, 整个项目中都始终拥有这

个单例对象, 并且这个单例对象在内存中都是同一个内存地址。

所以, 单例很重要的两个特点:

(1) app生命周期中一直存在(除主动销毁外)

(2) 在整个生命周期中, 都是同一个内存地址

根据这两个特点, 我来描述一个应用中的使用场景。 最简单和常用的就是, 我们用户的登录信息, 不做本地缓存的话, 我们登录成功之后, 把服务器请求下来的用户信息保存到单例中。 比如这样 [UserSingletonshareInstance].name = “张山”。 接下来, 你无论在应用的任何页面都可以直接通过[UserSingleton shareInstance].name的方式获取到用户的名字, 而且这个名字都是”张三”。 其他做法,都会比这个麻烦。

那么怎么写单例呢? 核心的一点就是, 我们平时创建一个实例对象时候用到的方法(alloc, init), 都要重写一遍,保证使用这些方法创建对象的时候是只分配一块内存地址,然后第一次创建之后再创建都指向前边已经创建过得那个内存地址,顺着这个思路,代码如下:

#import "Singleton.h"

@interface Singleton()<NSCopying,NSMutableCopying>

@end

@implementation Singleton

static Singleton* _instance = nil;

+(instancetype) shareInstance

{

    static dispatch_once_t onceToken ;

    dispatch_once(&onceToken, ^{

        _instance = [[super allocWithZone:NULL] init] ;

        //不是使用alloc方法,而是调用[[super allocWithZone:NULL] init]

        //已经重载allocWithZone基本的对象分配方法,所以要借用父类(NSObject)的功能来帮助出处理底层内存分配的杂物

    }) ;

 return _instance ;

}

+(id) allocWithZone:(struct _NSZone *)zone

{

    return [Singleton shareInstance] ;

}

-(id) copyWithZone:(NSZone *)zone

{

    return [Singleton shareInstance] ;//return _instance;

}

-(id) mutablecopyWithZone:(NSZone *)zone

{

    return [Singleton shareInstance] ;

}

@end

然后,OC有个语法糖可以写:

#import "Manager.h"

@implementation Manager

+(Manager *)sharedManager{

    static dispatch_once_t predicate;

    static Manager * sharedManager;

    dispatch_once(&predicate, ^{

        sharedManager=[[Manager alloc] init];

    });

    return sharedManager;

}

@end

题四:简述@selector的作用

Selector/SEL又叫方法选择器,SEL在objc.h中是这样声明的,而“@selector()”是取得一个SEL指针。说白了,方法选择器仅仅是一个char *指针,表示它所代表的是方法的名字。 简单来说: “@Selector 就是用字符串表示某个类的某个方法?!?更加专业的说法是: “Selector就是OC的虚拟表(virtual table)中指向实际执行的函数指针(function pointer)的一个C字符?!?/p>

我们一般用它来“因为method可以用字符串表示,因此,某个method就可以变成用来传递的参数?!?再说的透明一点, 因为 selector 可以看做是函数的另一个名字,所以很多需要调用函数或者建立连接的地方,都可以用到,以下是一些具体的使用场景:

  • Target/Action 模式
  • 检查 method 是否存在
  • Timer
  • 在线程中执行方法
  • 数组排序
  • 代替 if else / switch
  • 调用私有 API
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容

  • 现在已经不断有网友发我他们在面试中遇到的面试题,这是一位程序媛前面在面试中遇到的问题 前面两个过于基础,从提高题开...
    iOS开发_小贤阅读 1,632评论 0 9
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,094评论 1 32
  • 设计模式是什么? 你知道哪些设计模式,并简要叙述? 设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类型的...
    卑微的戏子阅读 622评论 0 1
  • 当北国 还是大雪纷飞 雪地冰天的时候 南国 已是春意盎然 燕舞莺歌 百花盛开 我爱你 南国 秀丽娇媚 温婉多情 更...
    夕阳在山阅读 106评论 0 1
  • 十九岁的林森会有许多许多烦恼。 她有过一个小男友,有过万恶的追人岁月,时间只能证明她是现代社会早熟的产物。实在很丢...
    最高虚构手笔阅读 363评论 0 0