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键进入后台时的生命周期? 从后台回到前台时的生命周期?
5.关于响应链
6.如何优化冒泡排序
7.实现离线发QQ
8.如图
9.socket中TCP的三次握手
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> 能动态删除一个类、一个成员变量、一个方法
方法实例:动态的修改系统方法
1>修改[UIImage ImageNamed:]的系统方法(使其能根据系统版本的不同,显示不同的图片)
2>重写NSMutableArray的addObject:方法,使其在添加空对象的时候不会使程序崩溃;重写NSArray的ObjectAtIndex:方法,使其即使出现数组越界也不会发生崩溃。
a)对交换系统方法和自定义方法的方法进行封装
b)重写系统方法并进行交换
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来控制是否显示