将会遇到的iOS面试题二

  1. @synthesize和@dynamic分别有什么作用?

@property有两个对应的词,一个是@synthesize,一个是dynamic,默认是@synthesize ,会自动生成下划线成员变量的getter和setter方法,
而dynamic会告诉编译器:属性的setter和getter方法由用户自己实现,不自动生成,假如一个属性被声明为@dynamic,而又没有提供getter 和setter方法,编译时不会有问题,而当程序运行时,当用到getter和setter方法的以后程序就会crash,这就是所谓的动态绑定。

  1. ARC下,不显式指定任何属性关键字时,默认的关键字都有哪些?

对于基本数据类型:atomic、readwrite、assign
对于对象:atomic、readwrite、strong

  1. 用@property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?
  • 因为父类指针可以指向子类对象,使用 copy 的目的是为了让本对象的属性不受外界影响,使用 copy 无论给我传入是一个可变对象还是不可对象,我本身持有的就是一个不可变的副本.
  • 如果我们使用是 strong ,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性.
  • copy设置方法不保留新值,而是将其”拷贝“。NSString用copy是为了保护其封装性,防止字符串的值在对象不知情的情况下遭人修改
    原文链接
  1. @synthesize合成实例变量的规则是什么?假如property名为foo,存在一个名为_foo的实例变量,那么还会自动合成新变量么?
  • 如果指定了成员变量的名称,会生成一个指定的名称的成员变量,
  • 如果这个成员已经存在了就不再生成了.
  • 如果是 @synthesize foo;
    还会生成一个名称为foo的成员变量,也就是说:
    如果没有指定成员变量的名称会自动生成一个属性同名的成员变量,
  • 如果是 @synthesize foo = _foo;
    就不会生成成员变量了.
    不会
    原文链接
  1. 在有了自动合成属性实例变量之后,@synthesize还有哪些使用场景?

实例变量 = 成员变量 = ivar
当想要手动管理@property的所有内容时,会通过实现 @property 的所有“存取方法”(the accessor methods)或者使用 @dynamic 来达到这个目的,这时编译器就会认为你打算手动管理 @property,于是编译器就禁用了 autosynthesis(自动合成)。
原文链接

  1. objc中向一个对象发送消息[obj foo]和objc_msgSend()函数之间有什么关系?

该方法编译之后就是objc_msgSend()函数调用.

  1. 什么时候会报unrecognized selector的异常?

当调用该对象上某个方法,而该对象上没有实现这个方法的时候, 可以通过“消息转发”进行解决。
objc在向一个对象发送消息时,runtime库会根据对象的isa指针找到该对象实际所属的类,然后在该类中的方法列表以及其父类方法列表中寻找方法运行,如果,在最顶层的父类中依然找不到相应的方法时,程序在运行时会挂掉并抛出异常unrecognized selector sent to XXX 。但是在这之前,objc的运行时会给出三次拯救程序崩溃的机会:

  • Method resolution
    objc运行时会调用+resolveInstanceMethod:或者 +resolveClassMethod:,让你有机会提供一个函数实现。如果你添加了函数,那运行时系统就会重新启动一次消息发送的过程,否则 ,运行时就会移到下一步,消息转发(Message Forwarding)。
  • Fast forwarding
    如果目标对象实现了-forwardingTargetForSelector:,Runtime 这时就会调用这个方法,给你把这个消息转发给其他对象的机会。 只要这个方法返回的不是nil和self,整个消息发送的过程就会被重启,当然发送的对象会变成你返回的那个对象。否则,就会继续Normal Fowarding。 这里叫Fast,只是为了区别下一步的转发机制。因为这一步不会创建任何新的对象,但下一步转发会创建一个NSInvocation对象,所以相对更快点。
    1. Normal forwarding
      这一步是Runtime最后一次给你挽救的机会。首先它会发送-methodSignatureForSelector:消息获得函数的参数和返回值类型。如果-methodSignatureForSelector:返回nil,Runtime则会发出-doesNotRecognizeSelector:消息,程序这时也就挂掉了。如果返回了一个函数签名,Runtime就会创建一个NSInvocation对象并发送-forwardInvocation:消息给目标对象
  1. 一个objc对象如何进行内存布局?(考虑有父类的情况)

  2. 一个objc对象的isa的指针指向什么?有什么作用?

指向他的类对象,从而可以找到对象上的方法

  1. runtime如何通过selector找到对应的IMP地址?(分别考虑类方法和实例方法)

每一个类对象中都一个方法列表,方法列表中记录着方法的名称,方法实现,以及参数类型,其实selector本质就是方法名称,通过这个方法名称就可以在方法列表中找到对应的方法实现.

  1. 使用runtime Associate方法关联的对象,需要在主对象dealloc的时候释放么?

无论在MRC下还是ARC下均不需要。

  1. objc中的类方法和实例方法有什么本质区别和联系?
  1. _objc_msgForward函数是做什么的,直接调用它将会发生什么?

  2. runtime如何实现weak变量的自动置nil?

  3. 能否向编译后得到的类中增加实例变量?能否向运行时创建的类中添加实例变量?为什么?

  4. runloop和线程有什么关系?

  5. runloop的mode作用是什么?

  6. 以+ scheduledTimerWithTimeInterval...的方式触发的timer,在滑动页面上的列表时,timer会暂定回调,为什么?如何解决?

  7. 猜想runloop内部是如何实现的?

  8. objc使用什么机制管理对象内存?

  9. ARC通过什么方式帮助开发者管理内存?

  10. 不手动指定autoreleasepool的前提下,一个autorealese对象在什么时刻释放?(比如在一个vc的viewDidLoad中创建)

  11. BAD_ACCESS在什么情况下出现?

  12. 苹果是如何实现autoreleasepool的?

  13. 使用block时什么情况会发生引用循环,如何解决?

  14. 在block内如何修改block外部变量?

  15. 使用系统的某些block api(如UIView的block版本写动画时),是否也考虑引用循环问题?

  16. GCD的队列(dispatch_queue_t)分哪两种类型?

串行队列、并发队列

  1. 如何用GCD同步若干个异步调用?(如根据若干个url异步加载多张图片,然后在都下载完成后合成一张整图)

  2. dispatch_barrier_async的作用是什么?

  3. 苹果为什么要废弃dispatch_get_current_queue?

dispatch_get_current_queue容易造成死锁。


  1. 什么是arc?(arc是为了解决什么问题诞生的?)

ARC是Auto Reference Counting的缩写,即自动引用计数,由编译器在代码合适的位置中自动添加retain/Release/Autorelease/dealloc方法从而进行内存管理.
ARC几个要点:
在对象被创建时 retain count +1,在对象被release时 retain count -1.当retain count 为0 时,销毁对象。
程序中加入autoreleasepool的对象会由系统自动加上autorelease方法,如果该对象引用计数为0,则销毁。
那么ARC是为了解决什么问题诞生的呢?这个得追溯到MRC手动内存管理时代说起。
MRC下内存管理的缺点:
当我们要释放一个堆内存时,首先要确定指向这个堆空间的指针都被release了。(避免提前释放)
释放指针指向的堆空间,首先要确定哪些指针指向同一个堆,这些指针只能释放一次。(MRC下即谁创建,谁释放,避免重复释放)
模块化操作时,对象可能被多个模块创建和使用,不能确定最后由谁去释放。
多线程操作时,不确定哪个线程最后使用完毕

  1. 请解释以下keywords的区别: assign vs weak, __block vs __weak

__block 说明符就为 block 提供了变量的修改权.
后者是 所有权修饰符 , 什么是所有权修饰符? 这里涉及到另一个问题, 因为在 ARC 有效时, id 类型和对象类型同 C 语言中的其他类型不同, 必须附加所有权修饰符. 所有权修饰符一种有 4 种:
__strong
__weak
__unsafe_unretained
__autorelease
__weak 与 weak 的区别只在于, 前者用于变量的声明, 而后者用于属性的声明.
__block和__weak修饰符的区别其实是挺明显的:
1.__block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。
2.__weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型(int)。
3.__block对象可以在block中被重新赋值,__weak不可以。
也就是说,在MRC下,我们通常使用__block,而在ARC下我们通常使用__weak,或者__unsafe_unretained __block(不安全,不建议使用)来修饰防止循环引用而造成的内存泄露。

  1. __block在arc和非arc下含义一样吗?
  • 非arc下 __block修饰的变量的引用计算是不变的
  • arc iOS5之后用__weak iOS, 5之前可以用__unsafe_unretained
  • arc下__block 使block可以访问并修改外部变量
  1. 使用atomic一定是线程安全的吗?

atomic:原子属性,为setter方法加锁(默认就是atomic)
nonatomic:非原子属性,不会加锁
atomic:线程安全,需要消耗大量的资源
nonatomic:非线程安全,适合内存小的移动设备

  1. 描述一个你遇到过的retain cycle例子。(别撒谎,你肯定遇到过)

  2. +(void)load; +(void)initialize;有什么用处?

load:类初始化加载时调用,调用顺序是父类优于子类,子类优于分类
initialize:第一次调用类的类方法或实例方法之前调用
这两个方法只有实现了才会被调用

  1. 为什么其他语言里叫函数调用, objective c里则是给对象发消息(或者谈下对runtime的理解)

在java中,类和方法在编译期就绑定在一起
在OC中,方法调用是向类发送消息,如(bady cry)在运行时会转换成objc_msgSend(bady,cry),向对象发送消息时根据isa指针找到类,在根据类的调度表查找方法,没找到方法则在父类中查找直至基类,如果始终没有找到返回nil
Objective-C 的 Runtime 铸就了它动态语言的特性,这些深层次的知识虽然平时写代码用的少一些,但是却是每个 Objc 程序员需要了解的。Objc Runtime使得C具有了面向对象能力,在程序运行时创建,检查,修改类、对象和它们的方法。可以使用runtime的一系列方法实现。

  1. 什么是method swizzling?

  2. UIView和CALayer是啥关系?

  1. 首先UIView可以响应事件,Layer不可以.
    UIApplication、UIViewController、UIView、和所有从UIView派生出来的UIKit类(包括UIWindow)都直接或间接地继承自UIResponder类。
    CALayer直接继承 NSObject,并没有相应的处理事件的接口。
  2. UIView是CALayer的delegate
  3. UIView主要处理事件,CALayer负责绘制就更好
  4. 每个 UIView 内部都有一个 CALayer 在背后提供内容的绘制和显示,并且 UIView 的尺寸样式都由内部的 Layer 所提供。两者都有树状层级结构,layer 内部有 SubLayers,View 内部有 SubViews.但是 Layer 比 View 多了个AnchorPoint
  1. 如何高性能的给UIImageView加个圆角?(不准说layer.cornerRadius!)

  2. 使用drawRect有什么影响?(这个可深可浅,你至少得用过。。)

  3. ASIHttpRequest或者SDWebImage里面给UIImageView加载图片的逻辑是什么样的?(把UIImageView放到UITableViewCell里面问更赞)

  4. 麻烦你设计个简单的图片内存缓存器(移除策略是一定要说的)

  5. 讲讲你用Instrument优化动画性能的经历吧(别问我什么是Instrument)

  6. loadView是干嘛用的?

loadview在view为nil时调用,早于ViewDidLoad
当用到nib文件时,加载nib文件
没有用到,默认创建一个空view,可以自定义一个view赋值给self.view,不必调用super

  1. viewWillLayoutSubView你总是知道的。
    链接

  2. GCD里面有哪几种Queue?你自己建立过串行queue吗?背后的线程模型是什么样的?

  3. 用过coredata或者sqlite吗?读写是分线程的吗?遇到过死锁没?咋解决的?

  4. http的post和get啥区别?(区别挺多的,麻烦多说点)

  5. 我知道你大学毕业过后就没接触过算法数据结构了,但是请你一定告诉我什么是Binary search tree? search的时间复杂度是多少?我很想知道!

产品设计方面问题

  • iOS应用图标是指什么?请尽可能详细地描述一下。

  • 最小尺寸和最大尺寸的应用图标分别是什么样子的?

  • 应用图标能否包含透明的部分?

  • Newsstand的图标与常规应用有何不同?

  • 请解释一下启动画面(Launch Images)。

  • 自动布局(Auto Layout)的作用是什么?请概括一下它是如何* 运行的。

  • 设计软件时为什么要加上动画?

  • 请描述一下软件设计中的交互和Feedback有什么作用。

  • 设计iPhone和iPad应用时,应分别考虑哪些因素?

  • 请描述一下原型设计对于软件开发的意义。其作用是什么?

  • 关于App Store

  • 应用内购买(In-App Purchases)是怎么回事?IAP能够为用户带来哪些新体验?

  • 你是否在App Store上发布过应用?能否概括一下过程?

  • iTunes Connect是什么?

  • Provisioning Profiles是指?

  • App ID是什么?

  • iOS的开发和发布签名证书有何异同?

  • 如何使用TestFlight?通过Ad-hoc发布应用的话,该如何使用UUID?

  • 应何时验证购买收据?
    *发布iAds(苹果平台广告)有哪些要求?

面经分享
链接:[iOS]关于面试,做一次整理吧(包含BAT面试题目)

高频率重点问题:

1.说说 UITableView 的调优。

一方面是通过 instruments 检查影响性能的地方,另一方面是估
算高度并在 runloop 空闲时缓存。

  1. 谈谈你对 ARC 的理解。

ARC 是编译器完成的,依靠引用计数,谈谈几个属性修饰符的内存管理策略,什么情况下会内存泄露。

3.MVC 具有什么样的优势,各个模块之间怎么通信,比如点击 Button 后 怎么通知 Model?

4.KVO、Notification、delegate 各自的优缺点,效率还有使用场景

  1. 当接收者不需要关注发送者,只关注此消息,并且消息传递是单向时,使用Notifications
  2. block是iOS4加入的,

5.如何手动通知 KVO

6.runtime 中,SEL 和 IMP 的区别

7.autoreleasepool 的使用场景和原理

8.RunLoop 的实现原理和数据结构,什么时候会用到

9.使用 GCD 如何实现这个需求:A、B、C 三个任务并发,完成后执行任务 D。

10.如何设计图片缓存?

11.说说你对 OC 中 load 方法和 initialize 方法的异同。——主要说一下执行时间,各自用途,没实现子类的方法会不会调用父类的?

12.说说你对 block 的理解。—— 三种 block,栈上的自动复制到堆上,block 的属性修饰符是 copy,循环引用的原理和解决方案。

链接:objc 中的 block

  • 编译器会根据block捕获的变量,生成具体的结构体定义。block内部的代码提取成一个单独的C函数。
    创建block时,实际就是在方法中声明一个结构体(struct),并且初始化该struct的成员,执行block时,就是调用单独的C函数,并把struct指针传递过去。
  • block中包含了被引用的自由变量(由struct持有),也包含了控制成分的代码块(由函数指针持有),符合闭包(closure)的概念。
  • block中的isa指向的是该block的Class
    _NSConcreteStackBlock 栈上创建的block
    _NSConcreteMallocBlock 堆上创建的block
    _NSConcreteGlobalBlock 作为全局变量的block

1.怎么判断某个 cell 是否显示在屏幕上
2.TCP 流量控制
3.数组和链表的区别
4.UIView 生命周期
5.如果页面 A 跳转到 页面 B,A 的 viewDidDisappear 方法和 B 的 viewDidAppear 方法哪个先调用?
6.ARC 的本质
ARC是iOS5推出的
7.RunLoop 的基本概念,它是怎么休眠的?
8.如何找到字符串中第一个不重复的字符
9.哈希表如何处理冲突

腾讯
如何绘制一个三角形?
1.1 如何绘制大量三角形?
1.2 一定要重写drawRect吗?
1.3 如何刷新View界面?
1.4 Layer好在哪?
assign和weak的区别
线程和RunLoop的关系
3.1 一个autorealese对象在什么时刻释放?(比如在一个vc的viewDidLoad中创建)
NSTimer有什么需注意的以及和RunLoop的关系?
NSString copy 和 NSString mutableCopy 的区别
线程加锁原理(信号量,临界区,自选锁)
iOS7 - iOS9的区别
GCD指向了野指针了怎么办
用HTTP传数据,丢包严重怎么办
iOS中广播的种类
app slying
runtime如何实现weak变量的自动置nil?
AFNetworking的内部实现原理?
block循环引用了如何解决?
如何用GCD同步若干个异步调用?(如根据若干个url异步加载多张图片,然后在都下载完成后合成一张整图)
UIKit的框架结构?

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

推荐阅读更多精彩内容