将会遇到的iOS面试题二,问题列表

作者:新葡京简介

以自己的理解答一遍,有错请指出谢谢,大家一起进步.

一.在iPhone应用中如何保存数据
1.通过web服务,保存在服务器上
2.通过NSCoder固化机制,将对象保存在文件中
3.通过SQlite或CoreData保存在文件数据库中

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

参考知乎

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

二.什么是coredata
coredata框架是apple提供的一套通用自动的解决方案,包括了对象生存周期,对象关系图,持久话化制

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

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

ARC自动引用计数,就是自动生成retain和release代码,为了解决MRC多或少写retain和release代码导致内存泄露或者访问僵尸对象导致程序崩溃等内存管理问题,减少程序员的工作量,把时间放在业务逻辑上。

三.什么是NSManagedobjectContext
NSManagedbjectContext对象负责应用和数据库之间的交互。

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

ARC,自动引用计数,内存管理。

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

四.coredata有哪几种持久话存储机制
1.XML(iOS系统不支持) 2. 自动存储 3.SQLite,4.内存存储

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

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

assign: 一般由于修饰基本类型

weak:一般用来防止对象ARC下的多重和循环引用,指向的对象被释放时会自动设置成nil,防止野指针的出现

Has an assign attribute, AND Has been deallocated. Thus when you attempt to call the respondsToSelector method on delegate, you get a EXC_BAD_ACCESS. This is because objects that use the assign property will not be set to nil when they are deallocated. (Hence why doing a !self.delegate before the respondsToSelector does not prevent the responseToSelector from being called on a deallocated object, and still crashes your code) The solution is to use the weak attribute, because when the object deallocates, the pointer WILL be set the nil . So when your code calls respondsToSelector on a nil, Objective C will ignore the call, and not crash.

大概意思assign属性不会在对象被释放的时候将该属性设置成nil,self.delegate发送

respondsToSelector消息,向已经释放的对象发送消息意味着访问僵尸对象,会导致崩溃,

when the object deallocates, the pointer WILL be set the nil . So when your code calls respondsToSelector on a nil, Objective C will ignore the call, and not crash.

__block:被修饰的变量会以地址的形式被block引用,ARC和MRC通用

- setName(NSString *)name {

_name = name; //assign管你是啥直接赋值

//retain和strong关键字如下:

if (_name == name) return; //如果指向的对象相同,不做任何处理

[ _name release]; //旧对象引用计数-1

_name = [name retain]; //新对象引用计数 1

}

五.BOOL和bool的区别
OC中的BOOL值是一种对带符号的字符类型的类型定义,通过#define指令把YES定义为1,NO定位0;
1.类型不同:BOOL为int型,bool为布尔型
2.长度不同:bool只有一个字节,BOOL长度视实际环境来决定,一般可认为是4个字节
3.取值不同:bool取得是false和ture是0和1的区别,BOOL取得是FALSE和TURE是0和非0的区别。

  1. 用@property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?

assign用于primitive type,weak用于object

  1. __block在arc和非arc下含义一样吗?

  2. 使用atomic一定是线程安全的吗?

六.请解释一下keywords的区别:assign vs weak,__block vs __weak
1.assign适用于基本数据类型,weak适用于NSObject对象,并且是一个弱引用。
assign可以用来修饰对象,但是assign修饰的对象在释放之后指针的地址为nil,如果在后续的内存分配中刚好分配到这块地址,系统就会奔扩。而weak修饰的对象在释放之后,指针地址会被置为nil。所以一般弱引用用weak.
2.__block是用来修饰一个变量,这个变量可以在block中被修改,
__block:使用__block修饰的变量会在block代码块中被retain(ARC,MVC下不会)
__weak:使用__weak修饰的变量不会在block代码块中被retain
同时在ARC下,要避免block出现循环引用__weak typedof(self)weakSelf = self

  • 因为父类指针可以指向子类对象,使用 copy 的目的是为了让本对象的属性不受外界影响,使用 copy 无论给我传入是一个可变对象还是不可对象,我本身持有的就是一个不可变的副本.
  • 如果我们使用是 strong ,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性.
  • copy设置方法不保留新值,而是将其”拷贝“。NSString用copy是为了保护其封装性,防止字符串的值在对象不知情的情况下遭人修改
    原文链接

__block为block捕获的变量提供了修改权,__weak防止block内的循环引用。

你这样问肯定是不一定安全呗,atomic只是在Set方法上做了锁,假如绕过Set方法操作这个属性,比如直接访问实例变量,可变的对象removeObj,aqqendObj,等等

七.__block在ARC和非ARC下含义是一样的么
__block在ARC下捕获的变量会被block retain,这样会导致循环引用,所以必须要使用弱引用__weak才可以解决问题,在非ARC下,可以直接使用__block说明符修饰变量,因为在非ARC下,block不会被retain.

  1. @synthesize合成实例变量的规则是什么?假如property名为foo,存在一个名为_foo的实例变量,那么还会自动合成新变量么?
  1. __block在arc和非arc下含义一样吗?
  1. 描述一个你遇到过的retain cycle例子。(别撒谎,你肯定遇到过)

八.使用nonatomic一定是线程安全的吗?
不是,nonatomic的内存管理是非原子的,系统不会为setter方法加锁,非线程安全,适合内存较小的移动设备。
atomic原子操作,系统会为setter方法加锁,线程安全,需要消耗大量的系统资源来为属性加锁。
所以atomic是线程安全的,nonatomic是线程不安全的,如果只是单线程操作的话,用nonatomic最好。

  • 如果指定了成员变量的名称,会生成一个指定的名称的成员变量,
  • 如果这个成员已经存在了就不再生成了.
  • 如果是 @synthesize foo;
    还会生成一个名称为foo的成员变量,也就是说:
    如果没有指定成员变量的名称会自动生成一个属性同名的成员变量,
  • 如果是 @synthesize foo = _foo;
    就不会生成成员变量了.
    不会
    原文链接

我关心ARC...

一般就注意block和NSTimer的循环引用,block会对外部strong,copy,retain修饰的对象产生强引用,NSTimer会对绑定的对象产生强引用,在invalidate后才会解除;

九. (void)load;和 (void)initialize有什么用处?
在OC中,runtime会自动调用每个类的两个方法。 load会在类初始加载时调用,
initialize会在第一次调用类的方法或者实例方法之前被调用,这两个方法是可选的,且只有在实现了它们时才会被调用。共同点:两个方法都只会被调用一次。

  1. 在有了自动合成属性实例变量之后,@synthesize还有哪些使用场景?
  1. 使用atomic一定是线程安全的吗?
  1. load; initialize;有什么用处?

十.为什么其他语言里叫函数调用, objective c里则是给对象发消息(或者谈下对runtime的理解)
其他语言如C,JAVA,C 中提到的函数调用或者方法调用,是在编译期九已经决定了会调用那个函数,编译器在编译期就能检查出函数的执行是否正确。
而OC是一门动态的语言,是尽可能将所有工作推迟到运行时才决定他是基于runtime来工作,runtime的核心就是消息发送。
runtime:所有消息都会在运行的时候才确定,[obj message]在运行时会被转化为objc_msgSend(id self,Sel cmd,...)来执行,它会在运行时从选择子表中寻找对应的选择子(@selectr)并将其于现实进行绑定。
runtime几乎可以修改OC中的一切:class property objec ticar method protocol。
主要应用1.内省 2.为分类动态添加属性 3.使用方法调剂修改原有方法实现

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

不一定。比如当a线程写操作结束后,b线程进行写操作,之后当a线程进行读操作时,就读入的是b线程的值。

load会在类被import的时load是只要类所在文件被引用就会被调用,而initialize是在类或者其子类的第一个方法被调用前调用。所以如果类没有被引用进项目,就不会有load调用;但即使类文件被引用进来,但是没有使用,那么initialize也不会被调用。候调用, initialize会在类第一次被访问的时候调用.

父类(Superclass)的方法优先于子类的方法,类中的方法优先于类别中的方法。

十一.UIView和CALayer有什么关系
每一个UIView都对应一个Core Animation框架中的CALayer,在iOS上处理UIView实际上就是在操作CALayer.UIView是对CALayer的轻量级的封装。UIView继承自UIResponder处理来自用户的事件,CALyer继承自NSObject主要用于图层的渲染和动画。

  1. objc中向一个对象发送消息[obj foo]和objc_msgSend()函数之间有什么关系?
  1. 描述一个你遇到过的retain cycle例子。(别撒谎,你肯定遇到过)
  1. 为什么其他语言里叫函数调用, objective c里则是给对象发消息(或者谈下对runtime的理解)

十二.如何高性能的给UIImageView加个圆角。
给UIImageView或者说 UIKit的控件天假圆角都是改变clipsToBounds和layer.cornerRadius会强制Core Animation提前渲染屏幕的离屏绘制,给性能带来负面影响,所以使用贝塞尔曲线。eg:
UIImageView * imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0,0,100,100)];
imageView.center = CGPointMake(200,300);
UIImage * anotherImage = [UIImage imageName:@"image"];
UIGraohicsBeginImageContextWithOptions(imageView.bounds.sie,NO,1.0);
[[UIBezierPath bezierPathWithRoundedRect:imageView.boundscornerRadius:50]addClip];
[anotherImage drawInRect:imageView.bounds];
imageView.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraohicsEndImageContext();
[self.view addSubview:imageView];

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

我不想撒谎...

objective-c语言是基于runtime,

十三.hettp的POST和GET方法有什么区别
GET类型的请求是幂等的,而POST请求是有副作用的,GET用于获取一些资源而POST

  1. 什么时候会报unrecognized selector的异常?
  1. (void)load; (void)initialize;有什么用处?
  1. 什么是method swizzling?

  2. UIView和CALayer是啥关系?

当调用该对象上某个方法,而该对象上没有实现这个方法的时候, 可以通过“消息转发”进行解决。
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对象如何进行内存布局?(考虑有父类的情况)

load在类被import时调用,此时是改变类的行为的最佳时机,比如method swizzling。initialize在第一个消息发送之前被调用。

UIView负责处理事件是CALayer的delegate,CALayer负责将视图绘制到界面上

  1. 一个objc对象的isa的指针指向什么?有什么作用?
  1. 为什么其他语言里叫函数调用, objective c里则是给对象发消息(或者谈下对runtime的理解)
  1. 如何高性能的给UIImageView加个圆角?(不准说layer.cornerRadius!)

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

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

Objective-C是一门动态语言,[obj foo]在编译时被转换为objc_msgSend(obj, foo, ...)。

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

  1. runtime如何通过selector找到对应的IMP地址?(分别考虑类方法和实例方法)
  1. 什么是method swizzling?
  1. 麻烦你设计个简单的图片内存缓存器(移除策略是一定要说的)

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

  3. loadView是干嘛用的?

  4. viewWillLayoutSubView你总是知道的。。

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

方法搅拌,运行时交换两个方法的实现...

这个必须知道啊,看英文就知道了视图将要布局子视图啊,在这个方法里面给self.view的subview更新一下frame就好了.

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

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

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

UIView拥有CALayer,CALayer的Delegate是UIView 参考

串行队列:任务顺序执行,先进先出

并行队列:任务无序执行,先进不一定先出

主队列:属于串行队列,UI更新操作必须在该队列

全局队列:就是全局的并行队列

  1. objc中的类方法和实例方法有什么本质区别和联系?
  1. 如何高性能的给UIImageView加个圆角?(不准说layer.cornerRadius!)
  1. 用过coredata或者sqlite吗?读写是分线程的吗?遇到过死锁没?咋解决的?

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

  • 类方法:
    类方法是属于类对象的
    类方法只能通过类对象调用
    类方法中的self是类对象
    类方法可以调用其他的类方法
    类方法中不能访问成员变量
    类方法中不能直接调用对象方法
  • 实例方法:
    实例方法是属于实例对象的
    实例方法只能通过实例对象调用
    实例方法中的self是实例对象
    实例方法中可以访问成员变量
    实例方法中直接调用实例方法
    实例方法中也可以调用类方法(通过类名)
    以上答案在《招聘一个靠谱的 iOS》—参考答案(上)
    下面答案在《招聘一个靠谱的 iOS》—参考答案(下)

一般通过clipsToBounds和layer.cornerRadius会强制Core Animation提前渲染屏幕的离屏绘制,影响性能。

post带

  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)分哪两种类型?

可以通过贝塞尔曲线切割图片达到目的。

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

串行队列、并发队列

图片 1

1. 讲述一次在这个APP中,用户触发了一个事件,引起了一个服务请求,然后获取服务端返回,并且更新前端界面的过程。请说的详细一点,比如数据经过了哪些类的处理,每一次传递时的格式是怎么样的?

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

  2. dispatch_barrier_async的作用是什么?

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

图片 2

  1. 你参与的APP,是如何处理多个服务的同步发起的?

dispatch_get_current_queue容易造成死锁。

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

随后让面试者说一下APP的界面架构,这个比较随意。


drawRect依赖Core Graphics和UIKit根据传入的rect进行自定义绘制

问完了项目,就开始基础知识题啦~

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

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

Model层:

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
  1. 麻烦你设计个简单的图片内存缓存器(移除策略是一定要说的)

沙盒的目录结构是怎样的?各自一般用于什么场合?

__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. 讲讲你用Instrument优化动画性能的经历吧(别问我什么是Instrument)

  2. loadView是干嘛用的?

SQL语句问题:inner join、left join、right join的区别是什么?

  1. __block在arc和非arc下含义一样吗?

loadView是UIViewController的实例方法,会在获取试图控制器的view为nil时被调用。手写控制器时,重载此方法来定义view属性。

sqlite的优化

  • 非arc下 __block修饰的变量的引用计算是不变的
  • arc iOS5之后用__weak iOS, 5之前可以用__unsafe_unretained
  • arc下__block 使block可以访问并修改外部变量
  1. viewWillLayoutSubView你总是知道的。。

网络通信用过哪些方式(100%的人说了AFNetworking...)

  1. 使用atomic一定是线程安全的吗?

视图的bounds改变(如屏幕旋转)时被调用,视图子视图位置发生改变前重载此方法做出响应。

如何处理多个网络请求并发的情况

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

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

在网络请求中如何提高性能

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

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

mainQueue、globalQueue、customQueue

在网络请求中如何保证安全性

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

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

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

语言与基础知识:

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

并没有太多区别...

内存中的栈和堆的区别是什么?那些数据在栈上,哪些在堆上?

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

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

#define和const定义的变量,有什么区别

  1. 什么是method swizzling?

  2. UIView和CALayer是啥关系?

图片 3

什么情况下会出现内存的循环引用

  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

block中的weak self,是任何时候都需要加的么?

  1. 如何高性能的给UIImageView加个圆角?(不准说layer.cornerRadius!)

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

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

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

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

  6. loadView是干嘛用的?

GCD的queue,main queue中执行的代码,一定是在main thread么?

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

NSOperationQueue有哪些使用方式

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

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

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

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

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

NSThread中的Runloop的作用,如何使用?

产品设计方面问题

  • 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面试题目)

.h文件中的变量,外部可以直接访问么?(注意是变量,不是property)

高频率重点问题:

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的框架结构?

讲述一下runtime的概念,message send如果寻找不到相应的对象,会如何进行后续处理 ?

TCP和UDP的区别是什么?

MD5和Base64的区别是什么,各自场景是什么?

二叉搜索树的概念,时间复杂度多少?

UI:

系统如何寻找到需要响应用户操作的那个Responder

多屏幕尺寸的适配

UIButton的父类是什么?UILabel呢?

push view controller 和 present view controller的区别

描述下tableview cell的重用机制

UIView的frame和bounds的区别是什么

最后是几道场景题,也是我最喜欢问的:

发送10个网络请求,然后再接收到所有回应之后执行后续操作,如何实现?

实现一个第三方控件,可以在任何时候出现在APP界面最上层

实现一个最简单的点击拖拽功能。

上面那个拖拽之外,如果在手放开时,需要根据速度往前滑动呢?

如何减小一个应用程序的尺寸?

如何提高一个性用程序的性能?

不同版本的APP,数据库结构变化了,如何处理?

链接:

本文由新葡京8455发布,转载请注明来源

关键词: