面试题总结

1.OC的动态运行时语言的原因


1)多态将数据类型的确定由编译时,推迟到了运行时

多态:不同对象以自己的方式响应相同的消息的能力

2.类变量的@protected,@private,@public,@package的 声明各有什么含义


主要是时类成员的作用域不同;

1)@protected(自身类和其子类,外界不可访问,但是能继承),系统默认的类变量声明;

2)@private (自身类,外界既不能访问,也不能继承)

3)@public(可以在任何地方被访问,外界既能访问,又可以继承)

4)@package(作用在某个框架内)

3.关于OC中的内存管理机制,release与dealloc的区别? assign,retain,copy,nonatomic,atomic,strong,weak属性的作用?


OC使用引用计数机制管理对象,当对象使用了alloc,Mutable copy,retain时,必须使用相对应的realease或者autorelease(即自己生成的对象自己持有,不需要时自己释放)                                   生成并持有对象(alloc,mutableCopy,retain)                            

                                        持有对象(retain)

                                        释放对象(release)

                                         废弃对象(dealloc)

nonatomic(不考虑线程安全);atomic(默认,考虑线程安全)

strong(默认):ARC和MRC下retain一样; weak   ARC下和assin类似,当指向的内存释放掉时自动置为空,防止野指针出现

4.应用程序按home键进入后台时的生命周期? 从后台回到前台时的生命周期?


面试题总结_第1张图片

5.关于响应链


面试题总结_第2张图片

6.如何优化冒泡排序


面试题总结_第3张图片


7.实现离线发QQ


面试题总结_第4张图片


8.如图


面试题总结_第5张图片


9.socket中TCP的三次握手


面试题总结_第6张图片








面试题总结_第7张图片

TCP:安全的协议,能保证数据顺序和正确性,服务器和客户端能随时互发数据。如果服务器要主动发送数据给客户端,可以用这个协议

UDP:非安全的协议,容易丢失数据,一般用于联机对战的游戏

XMPP:基于XML通讯的协议,基于TCP发送XML数据,一般用于即时通讯(比如QQ、微信)

HTTP:一般用于非实时连接的请求,只有客户端主动向服务器发送请求时,服务器才能返回数据给客户端

SOCKET:套接口,可以使用TCP/UDP/XMPP通讯


6.KVO的内部实现基理(类中的isa指针指向发生改变)

1>KVO是基于runtime机制实现的

2>当某个子类的对象第一次被观察时,系统会在运行期间动态的创建该类的一个派生类,在这个派生类中重写基类中的任何被观察属性的setter方法。

派生类在重写的setter方法中实现真正的通知机制(Person -> NSKVONotifying Person)


7.是否可以把比较耗时的操作放在NSNotificationCenter中?

是否可以取决于我们要在哪里发送通知(因为接受通知时执行的方法所在线程和发送通知所在线程是一致的);

1>如果在异步线程发送通知,那么可以在接收通知的方法中执行比较耗时的操作;

2>如果在主线程中发送通知,那么就不能执行比较耗时的操作;


8.runtime 的概念?runtime的用法?

1> runtime是一套底层的C语言API(包含很多强大实用的C语言数据类型、C语言函数)

2> 实际上,平时我们编写的OC代码,底层都是基于runtime实现的

* 也就是说,平时我们编写的OC代码,最终都是转成了底层的runtime代码(C语言代码)

1> 能动态产生一个类、一个成员变量、一个方法

2> 能动态修改一个类、一个成员变量、一个方法

3> 能动态删除一个类、一个成员变量、一个方法

面试题总结_第8张图片

方法实例:动态的修改系统方法

1>修改[UIImage ImageNamed:]的系统方法(使其能根据系统版本的不同,显示不同的图片)

面试题总结_第9张图片

2>重写NSMutableArray的addObject:方法,使其在添加空对象的时候不会使程序崩溃;重写NSArray的ObjectAtIndex:方法,使其即使出现数组越界也不会发生崩溃。

a)对交换系统方法和自定义方法的方法进行封装

面试题总结_第10张图片

b)重写系统方法并进行交换


面试题总结_第11张图片

c)在ViewDidLoad中直接调用系统方法,runtime机制会在运行时直接进行类方法和自定义方法的交换


9.父子控制器的重要性;

当我们将其他控制器添加到主控制器时,如果没有确定主控制器与填入的控制器的复制关系,即:

[self.parentViewController  addChildViewController:childViewController]

则子控制器获取不了主控制器的屏幕旋转方法,也无法获得主控制器的self.NavigationController 完成不了控制器之间的跳转,因此当将其他控制器添加到一个主控制器中时,确定子控制器与主控制器间的父子关系非常重要。

10.如果后期需要增加数据库中的字段怎么实现,如果不使用CoreData呢?

编写SQL语句来操作原来表中的字段

1>增加表字段

ALTER TABLE 表名 ADD COLUMN 字段名 字段类型;

2>删除表字段

ALTER TABLE 表名 DROP COLUMN 字段名;

3>修改表字段

ALTER TABLE 表名 RENAME COLUMN 旧字段名 TO 新字段名


11.关于tableview的优化问题

UITableView的优化主要从三个方面入手:

1》提前计算并缓存好高度(布局),因为heightForRowAtIndexPath:是调用最频繁的方法;

2》异步绘制,遇到复杂界面,遇到性能瓶颈时,可能就是突破口;

3》滑动时按需加载,这个在大量图片展示,网络加载的时候很管用!(SDWebImage已经实现异步加载,配合这条性能杠杠的)。

除了上面最主要的三个方面外,还有很多几乎大伙都很熟知的优化点:

1.正确使用reuseIdentifier来重用Cells

2.尽量使所有的viewopaque,包括Cell自身

3.尽量少用或不用透明图层

4.如果Cell内现实的内容来自web,使用异步加载,缓存请求结果

5.减少subviews的数量

6.在heightForRowAtIndexPath:中尽量不使用cellForRowAtIndexPath:,如果你需要用到它,只用一次然后缓存结果

7.尽量少用addView给Cell动态添加View,可以初始化时就添加,然后通过hide来控制是否显示

你可能感兴趣的:(面试题总结)