专栏首页iOS开发干货分享iOS面试现场,笔试提高题详解
原创

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

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

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

代理的的是改变或传递控制链。允许个类在某些特定时刻通知到其他类,而需要获取到那些类的指针。可以减少框架复杂度。

什么是代理?

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

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

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

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

代理的实现流程

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

代理的内存管理

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

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

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

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

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

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

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

代理与block的对

1.多个消息传递,应该使delegate。在有多个消息传递时,delegate实现更合适,看起来也更清晰。block就不太好了,这个时候block反而便于维护,且看起来常臃肿,很别扭。例如UIKitUITableView中有很多代理如果都换成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 也需持多继承,我们可以找到如下种间接实现多继承的方法:

  • 通过组合实现“多继承”
  • 通过协议实现“多继承”

通过组合实现“多继承”

通过协议实现“多继承

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

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

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

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

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

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

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

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

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

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

题四:简述@selector的作用

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

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

  • Target/Action 模式
  • 检查 method 是否存在
  • Timer
  • 在线程中执行方法
  • 数组排序
  • 代替 if else / switch
  • 调用私有 API

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 详解高级PHP工程师面试题

    这里想要给大家分享一下自己使用过程中产生的疑惑,以及解决的这些疑惑的过程。话又说回来,我现在依然充满疑惑。真不知道30岁的时候会不会不惑。

    码农编程进阶笔记
  • 2018最新最全BAT 全套高级iOS面试题以及面试资料强势来袭

    一千个读者眼中有一千个哈姆雷特,一千名 iOS 程序员心目中就有一千套 iOS 高级面试题。本文就是笔者认为可以用来面试高级 iOS 程序员的面试题。

    原来是泽镜啊
  • 出一套 iOS 高级面试题

    一千个读者眼中有一千个哈姆雷特,一千名 iOS 程序员心目中就有一千套 iOS 高级面试题。本文就是笔者认为可以用来面试高级 iOS 程序员的面试题。

    用户2932962
  • iOS开发笔记(九)— 数据库、Crash、内存问题分析

    分享iOS开发中遇到的问题,和相关的一些思考,本次内容包括:UIKit的iOS11问题、数据库问题定位、线上Crash处理、内存问题分析。

    落影
  • 3道Redis高频面试题详细解析

    随着系统访问量的提高,复杂度的提升,响应性能成为一个重点的关注点。而缓存的使用成为一个重点。redis 作为缓存中间件的一个佼佼者,成为了面试必问项目。本文分享...

    程序IT圈
  • 详解一道高频面试题:接雨水

    接雨水这道题目挺有意思,在面试题中出现频率还挺高的,本文就来步步优化,讲解一下这道题。

    帅地
  • 一眼就看出你的简历是包装过的,老司机揭秘求职套路

    https://my.oschina.net/hooker/blog/3014656

    南风
  • FPGA/ASIC笔试面试题集锦(1)知识点高频复现练习题

    本文其实就是整合了一下去年秋招时总结的笔试题或者各大平台的练习题,只不过去年由于边笔试面试边总结,比较粗糙,这里再次整理润色一下,前人栽树,方便后人乘凉!注:个...

    Reborn Lee
  • 【阅读清单】有奖内测体验活动

    完成了内测体验的小伙伴,可以填写问卷,活动结束后我们将统一进行审核,审核结束就进行礼品发放。问卷链接:https://wj.qq.com/s2/7433898/...

    云加社区
  • 移动端网页调试方案

    由于移动端网页开发不能直接打开developer tools,导致我们调试起来稍微麻烦。好在我们有解决方案: Remote Devices 谷歌为我们提供的...

    从今若
  • 移动端网页调试方案

    移动端调试方案 页面容器 移动设备上的各种浏览器 各类app内的webview debug方案 Android端 iOS端 跨平台 抓包工具Charles 调试...

    IMWeb前端团队
  • appium 入门参考

    游戏发行业务中,对游戏进行测试是保证游戏质量重要的一环。传统人工测试的方法费时费力、容易出错,所以自动化测试技术显然才是更好的解决方案。而 appium 就是自...

    37手游iOS技术运营团队
  • 那些年我们一起用过的Hybrid App

    Hybrid App现状分析 Web App 毫无疑问Web App就是成本最低,最快速地解决方案了。尤其是近两年非常流行的响应式设计,Web App市场提供了...

    xiangzhihong
  • 图解面试题:如何提高SQL查询的效率?

    我们公司的数据量非常大,需要的不仅仅是提取数据,要了解SQL方案优化的。一般在写SQL时需要注意哪些问题,可以提高查询的效率?

    猴子聊数据分析
  • 偏执的iOS逆向研究员:收集全版本的macOS iOS+越狱+内核调试

    Intro 虽然“只有偏执狂才能够生存”这句话已经被假药停给毁了,但是作为一只有逼格的高大上的iOS逆向分析研究员,难道如果有现成的macOS/iOS全版本镜像...

    FB客服
  • 2018年 iOS 面试心得

    面试了几家公司之后,最后来到了爱奇艺(坐标上海),工作的内容是笔者个人非常感兴趣的领域。能拿到这个结果对于入行两年半&非科班的笔者来说无疑是幸运的。

    用户2932962
  • 精选面试题教你应对高级iOS开发面试官(提供底层进阶规划蓝图)

    *@property (copy)NSMutableArray array;这写法会出什么问题?

    编程怪才-凌雨画
  • 网页适配 iPhoneX

    iPhoneX 取消了物理按键,改成底部小黑条,这一改动导致网页出现了比较尴尬的屏幕适配问题。对于网页而言,顶部(刘海部位)的适配问题浏览器已经做了处理,所以我...

    子润先生
  • 瞬息万变的技术圈与焦虑的技术人,进阶Android需要掌握的那几个关键技术

    过了30岁后的人很多都会感受到一个问题:从大学毕业到迈入30岁其实只是一瞬,感觉没做什么,还没潇洒完,还没耍帅够就听着身边的人开始叫你大叔、大哥了。而30岁后更...

    Android技术干货分享

扫码关注云+社区

领取腾讯云代金券