1.Object-C 是如何实现内存管理的? 经常使用的内存管理语句有哪些?html
Object-C 中的内存管理也就是引用计数机制。
手动引用计数(MRC),当建立一个对象的时候系统会为这个对象的引用计数置为1,retain方法会使对象的引用计数加1,release方法会使对象的的引用计数减1,当引用计数为0时, 调用dealloc方法去销毁对象。ios
自动引用计数(ARC),自动引用计数的实质仍是经过引用计数机制去管理的,只不够不用咱们程序员去手动管理,系统会在程序编译时自动在合适的地方添加retain、release、autorelease 方法去控制引用计数的平衡。
内存管理的经常使用语句有 alloc 、retain 、release 、dealloc 、autorelease 。程序员
顺便提一下 内存管理严格遵循四条规则?
一、由本身生成的对象,本身持有
二、非本身生成的对象,本身也能持有
三、再也不须要本身持有的对象时释放
四、非本身持有的对象没法释放面试
2.浅拷贝和深拷贝的区别? 写一段深拷贝的代码。sql
浅拷贝就是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间.设计模式
深拷贝就是指拷贝对象的具体内容,而内存地址是自主分配的,拷贝结束以后,两个对象虽然存的值是相同的,可是内存地址不同,两个对象也互不影响,互不干涉。性能优化
void testMutable() { //可变对象的复制,copy和mutableCopy都是深拷贝 NSMutableString *str1 = [NSMutableString stringWithString:@"test"]; NSMutableString *str2 = [str1 copy]; //copy返回的是不可变对象,所以str2不能改变,会发生崩溃 //[str2 appendString:@"test"]; NSMutableString *str3 = [str1 mutableCopy]; [str3 appendString:@"test"]; NSLog(@"%@ %@ %@",str1,str2,str3); NSLog(@"%p %p %p",str1,str2,str3); }
3.下面一点错误百出的程序,指出它有什么问题。网络
typedef void(^MyBlock)(NSString *str); @interface ViewController @property(weak) MyBlock block; @property(nonatomic,strong) NSString *currentText; @end --------------------------- @implementation ViewController -(void)method{ NSString *text =@"123"; self.block = ^(NSString *str){ self.currentText = str; text = str; }; } @end ---------更正的代码以下-------- typedef void(^MyBlock)(NSString *str); @interface ViewController:NSObject @property(copy) MyBlock block; @property(nonatomic,copy) NSString *currentText; @end --------------------------- @implementation ViewController -(void)method{ __block NSString *text =@"123"; __weak typeof(self) weakSelf = self; self.block = ^(NSString *str){ weakSelf.currentText = str; text = str; }; } @end
4.从名为 'employee' 的 sqlite 表中查找 'name' 属性以 'Jo' 开头的从符合结构的第100条开始10条记录,按 'updatedAt' 倒序。多线程
这个先不写了,我要好好看一下在贴出来。 哈哈哈
5.iOS 中经常使用的设计模式有哪些? Notification 和 Delegate 使用区别。并发
MVC 、MVVM 、代理 、block 、KVC 、KVO 。
Notification 和 Delegate 均可以用来传递消息。
Delegate 是一对一的,两者要创建相互关联。
Notification 是一对一 或 一对多的,两者不须要作相互关联。
Delegate 的效率要比 Notification 高。
6.tableView 的DateSource 协议有哪些方法必需要实现,怎么进行性能优化?
(1)numberOfSectionsInTableView: //可写可不写(当一个分区的时可不写) (2)tableView:numberOfRowsInSecion: (3)tableView:cellForRowAtIndexPath: 优化问题: (1):网络请求成功后进入后台进行布局计算并返回高度缓冲备用。 (2):当cell的subview较多时尤为是图片的时候建议用其drawRect:中自行绘制。 (3):透明的问题,将UI元素的透明度设置成不透明的。
7.iOS 中的多线程实现有哪些,对你了解最深刻的说说你的理解。
一、NSThread
二、NSOperation
三、Grand Central Dispatch (GCD)
一、使用线程能够把程序中占据时间长的任务放到后台去处理,如图片、视频的下载。 二、发挥多核处理器的优点,并发执行让系统运行的更快、更流畅,用户体验更好。 三、能适当提升执行效率,提升资源利用率。 四、建立线程是有开销的,大量开启的话,会下降性能;程序设计也会更复杂,好比线程之间的通讯,多线程的数据共享。 5.GCD会自动管理线程的生命周期(建立线程,调度任务,销毁线程),不须要咱们编写任何管理线程的代码。 6.http://blog.sina.com.cn/s/blog_99c943d00102wphm.html