- @synthesize和@dynamic分别有什么作用?
@property有两个对应的词,一个是@synthesize,一个是dynamic,默认是@synthesize ,会自动生成下划线成员变量的getter和setter方法,
而dynamic会告诉编译器:属性的setter和getter方法由用户自己实现,不自动生成,假如一个属性被声明为@dynamic,而又没有提供getter 和setter方法,编译时不会有问题,而当程序运行时,当用到getter和setter方法的以后程序就会crash,这就是所谓的动态绑定。
- ARC下,不显式指定任何属性关键字时,默认的关键字都有哪些?
对于基本数据类型:atomic、readwrite、assign
对于对象:atomic、readwrite、strong
- 用@property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?
- 因为父类指针可以指向子类对象,使用 copy 的目的是为了让本对象的属性不受外界影响,使用 copy 无论给我传入是一个可变对象还是不可对象,我本身持有的就是一个不可变的副本.
- 如果我们使用是 strong ,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性.
- copy设置方法不保留新值,而是将其”拷贝“。NSString用copy是为了保护其封装性,防止字符串的值在对象不知情的情况下遭人修改
原文链接
- @synthesize合成实例变量的规则是什么?假如property名为foo,存在一个名为_foo的实例变量,那么还会自动合成新变量么?
- 如果指定了成员变量的名称,会生成一个指定的名称的成员变量,
- 如果这个成员已经存在了就不再生成了.
- 如果是 @synthesize foo;
还会生成一个名称为foo的成员变量,也就是说:
如果没有指定成员变量的名称会自动生成一个属性同名的成员变量,- 如果是 @synthesize foo = _foo;
就不会生成成员变量了.
不会
原文链接
- 在有了自动合成属性实例变量之后,@synthesize还有哪些使用场景?
实例变量 = 成员变量 = ivar
当想要手动管理@property的所有内容时,会通过实现 @property 的所有“存取方法”(the accessor methods)或者使用 @dynamic 来达到这个目的,这时编译器就会认为你打算手动管理 @property,于是编译器就禁用了 autosynthesis(自动合成)。
原文链接
- objc中向一个对象发送消息[obj foo]和objc_msgSend()函数之间有什么关系?
该方法编译之后就是objc_msgSend()函数调用.
- 什么时候会报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对象,所以相对更快点。
- Normal forwarding
这一步是Runtime最后一次给你挽救的机会。首先它会发送-methodSignatureForSelector:消息获得函数的参数和返回值类型。如果-methodSignatureForSelector:返回nil,Runtime则会发出-doesNotRecognizeSelector:消息,程序这时也就挂掉了。如果返回了一个函数签名,Runtime就会创建一个NSInvocation对象并发送-forwardInvocation:消息给目标对象
一个objc对象如何进行内存布局?(考虑有父类的情况)
一个objc对象的isa的指针指向什么?有什么作用?
指向他的类对象,从而可以找到对象上的方法
- runtime如何通过selector找到对应的IMP地址?(分别考虑类方法和实例方法)
每一个类对象中都一个方法列表,方法列表中记录着方法的名称,方法实现,以及参数类型,其实selector本质就是方法名称,通过这个方法名称就可以在方法列表中找到对应的方法实现.
- 使用runtime Associate方法关联的对象,需要在主对象dealloc的时候释放么?
无论在MRC下还是ARC下均不需要。
- objc中的类方法和实例方法有什么本质区别和联系?
- 类方法:
类方法是属于类对象的
类方法只能通过类对象调用
类方法中的self是类对象
类方法可以调用其他的类方法
类方法中不能访问成员变量
类方法中不能直接调用对象方法- 实例方法:
实例方法是属于实例对象的
实例方法只能通过实例对象调用
实例方法中的self是实例对象
实例方法中可以访问成员变量
实例方法中直接调用实例方法
实例方法中也可以调用类方法(通过类名)
以上答案在《招聘一个靠谱的 iOS》—参考答案(上)
下面答案在《招聘一个靠谱的 iOS》—参考答案(下)
_objc_msgForward函数是做什么的,直接调用它将会发生什么?
runtime如何实现weak变量的自动置nil?
能否向编译后得到的类中增加实例变量?能否向运行时创建的类中添加实例变量?为什么?
runloop和线程有什么关系?
runloop的mode作用是什么?
以+ scheduledTimerWithTimeInterval...的方式触发的timer,在滑动页面上的列表时,timer会暂定回调,为什么?如何解决?
猜想runloop内部是如何实现的?
objc使用什么机制管理对象内存?
ARC通过什么方式帮助开发者管理内存?
不手动指定autoreleasepool的前提下,一个autorealese对象在什么时刻释放?(比如在一个vc的viewDidLoad中创建)
BAD_ACCESS在什么情况下出现?
苹果是如何实现autoreleasepool的?
使用block时什么情况会发生引用循环,如何解决?
在block内如何修改block外部变量?
使用系统的某些block api(如UIView的block版本写动画时),是否也考虑引用循环问题?
GCD的队列(dispatch_queue_t)分哪两种类型?
串行队列、并发队列
如何用GCD同步若干个异步调用?(如根据若干个url异步加载多张图片,然后在都下载完成后合成一张整图)
dispatch_barrier_async的作用是什么?
苹果为什么要废弃dispatch_get_current_queue?
dispatch_get_current_queue容易造成死锁。
- 什么是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下即谁创建,谁释放,避免重复释放)
模块化操作时,对象可能被多个模块创建和使用,不能确定最后由谁去释放。
多线程操作时,不确定哪个线程最后使用完毕
- 请解释以下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(不安全,不建议使用)来修饰防止循环引用而造成的内存泄露。
- __block在arc和非arc下含义一样吗?
- 非arc下 __block修饰的变量的引用计算是不变的
- arc iOS5之后用__weak iOS, 5之前可以用__unsafe_unretained
- arc下__block 使block可以访问并修改外部变量
- 使用atomic一定是线程安全的吗?
atomic:原子属性,为setter方法加锁(默认就是atomic)
nonatomic:非原子属性,不会加锁
atomic:线程安全,需要消耗大量的资源
nonatomic:非线程安全,适合内存小的移动设备
描述一个你遇到过的retain cycle例子。(别撒谎,你肯定遇到过)
+(void)load; +(void)initialize;有什么用处?
load:类初始化加载时调用,调用顺序是父类优于子类,子类优于分类
initialize:第一次调用类的类方法或实例方法之前调用
这两个方法只有实现了才会被调用
- 为什么其他语言里叫函数调用, objective c里则是给对象发消息(或者谈下对runtime的理解)
在java中,类和方法在编译期就绑定在一起
在OC中,方法调用是向类发送消息,如(bady cry)在运行时会转换成objc_msgSend(bady,cry),向对象发送消息时根据isa指针找到类,在根据类的调度表查找方法,没找到方法则在父类中查找直至基类,如果始终没有找到返回nil
Objective-C 的 Runtime 铸就了它动态语言的特性,这些深层次的知识虽然平时写代码用的少一些,但是却是每个 Objc 程序员需要了解的。Objc Runtime使得C具有了面向对象能力,在程序运行时创建,检查,修改类、对象和它们的方法。可以使用runtime的一系列方法实现。
什么是method swizzling?
UIView和CALayer是啥关系?
- 首先UIView可以响应事件,Layer不可以.
UIApplication、UIViewController、UIView、和所有从UIView派生出来的UIKit类(包括UIWindow)都直接或间接地继承自UIResponder类。
CALayer直接继承 NSObject,并没有相应的处理事件的接口。- UIView是CALayer的delegate
- UIView主要处理事件,CALayer负责绘制就更好
- 每个 UIView 内部都有一个 CALayer 在背后提供内容的绘制和显示,并且 UIView 的尺寸样式都由内部的 Layer 所提供。两者都有树状层级结构,layer 内部有 SubLayers,View 内部有 SubViews.但是 Layer 比 View 多了个AnchorPoint
如何高性能的给UIImageView加个圆角?(不准说layer.cornerRadius!)
使用drawRect有什么影响?(这个可深可浅,你至少得用过。。)
ASIHttpRequest或者SDWebImage里面给UIImageView加载图片的逻辑是什么样的?(把UIImageView放到UITableViewCell里面问更赞)
麻烦你设计个简单的图片内存缓存器(移除策略是一定要说的)
讲讲你用Instrument优化动画性能的经历吧(别问我什么是Instrument)
loadView是干嘛用的?
loadview在view为nil时调用,早于ViewDidLoad
当用到nib文件时,加载nib文件
没有用到,默认创建一个空view,可以自定义一个view赋值给self.view,不必调用super
viewWillLayoutSubView你总是知道的。
链接GCD里面有哪几种Queue?你自己建立过串行queue吗?背后的线程模型是什么样的?
用过coredata或者sqlite吗?读写是分线程的吗?遇到过死锁没?咋解决的?
http的post和get啥区别?(区别挺多的,麻烦多说点)
我知道你大学毕业过后就没接触过算法数据结构了,但是请你一定告诉我什么是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 空闲时缓存。
- 谈谈你对 ARC 的理解。
ARC 是编译器完成的,依靠引用计数,谈谈几个属性修饰符的内存管理策略,什么情况下会内存泄露。
3.MVC 具有什么样的优势,各个模块之间怎么通信,比如点击 Button 后 怎么通知 Model?
4.KVO、Notification、delegate 各自的优缺点,效率还有使用场景
- 当接收者不需要关注发送者,只关注此消息,并且消息传递是单向时,使用Notifications
- 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,循环引用的原理和解决方案。
- 编译器会根据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的框架结构?