一. 关键字volatile有什么含义?并给出三个不同例子
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了.
精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份.
下面是volatile变量的几个例子:
- 并行设备的硬件寄存器(如:状态寄存器)
- 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
- 多线程应用中被几个任务共享的变量
二.对象是什么时候被release的?
引用计数为0时. autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的 Autoreleasepool中,当该pool被释放时,该pool中的所有Object会被调用Release.对于每一个Runloop,系统会隐式创建一个Autoreleasepool,这样所有的release pool会构成一个象CallStack一样的一个栈式结构,每一个Runloop结束时,当前栈顶的Autoreleasepool会被销毁,这样这 个pool里的每个Object(就是autorelease的对象)会被release.那什么是一个Runloop呢?一个UI事件,Timercall, delegate call,都会是一个新的Runloop
三26、iOS有没有垃圾回收机制?
iOS在Objective-c 2.0之后,也提供了垃圾回收机制.但是在iOS移动终端设备中,并不支持垃圾回收机制.
因此.iPhone并不能对内存进行自动垃圾回收处理(autorelease).因此需要注意 垃圾回收机制并不是ARC,ARC也是需要管理内存的,只不过是隐式的管理内存,编译器会再适当的地方自动插入retain,release和 autorelease消息.
四. ViewController的didReceiveMemoryWarning是在什么时候调用的?默认的操作是什么?
当程序接到内存警告时View Controller将会收到这个消息:didReceiveMemoryWarning从iOS3.0开始,不需要重载这个函数,把释放内存的代码放到viewDidUnload中去。这个函数的默认实现是:检查controller是否可以安全地释放它的view(这里加粗的view指的是controller的view属性),比如view本身没有superview并且可以被很容易地重建(从nib或者loadView函数)。如果view可以被释放,那么这个函数释放view并调用viewDidUnload。你可以重载这个函数来释放controller中使用的其他内存。但要记得调用这个函数的super实现来允许父类(一般是UIVIewController)释放view。如果你的ViewController保存着view的子view的引用,那么,在早期的iOS版本中,你应该在这个函数中来释放这些引用。而在iOS3.0或更高版本中,你应该在viewDidUnload中释放这些引用。
五. delegate和notification区别,分别在什么情况下使用
delegate针对one-to-one关系,并且receiver可以返回值给sender;
notification 可以针对one-to-one/many/none,receiver无返回值给sender
六. 内存管理 Autorelease retain copy assign的set方法和含义
- 初始化对象(alloc/init)的对象 你需要释放(release)它 例如NSMutableArray aArray = [[NSArray alloc] init];后,需要[aArray release];
- 你retain或copy的,你需要释放它。例如:
[aArray retain]后,需要[aArray release]; - 被传递(assign)的对象,你需要斟酌的retain和release.例如:
obj2 = [[obj1 someMethod] autorelease];对象2接受对象1的一个自动释放的值,或传递一个基本数据类型(NSInteger,NSString)时:你或希望将对象2进行retain,以防止它在被使用之前就被自动释放掉.但是在retain后,一点要在适当的时候进行释放.
七. 谈谈你对索引计数的理解
retain值 = 索引计数(ReferenceCounting) NSArray对象会retain(retain值加一)任何数组中的对象.当NSArray被卸载(dealloc)的时候,所有数组中的对象会被执行一次释放(retain值减一).不仅仅是NSArray,任何收集类 (CollectionClasses) 都执行类似操作.例如NSDictionary,甚至UINavigationController.Alloc/init建立的对象,索引计数为1.无需将其再次retain[NSArray array]和[NSDate date]等“方法”建立一个索引计数为1的对象,但是也是一个自动释放对象所以是本地临时对象,那么无所谓了.如果是打算在全Class中使用的变量(iVar),则必须retain它.缺省的类方法返回值都被执行了“自动释放”方法.(如上中的NSArray)在类中的卸载方法“dealloc”中,release所有未被平衡的NS对象.(所有未被autorelease,而retain值为1的)
八. 异步请求最大数目是多大,为什么只能这么多
这个数量是跟cpu有关的,并发性取决于cpu核数,每个核只能同时处理一个任务.4核cpu理论上可以并发处理4个任务,如果按http来算就是4个请求,但是cpu是抢占式资源,所以一般来说并发量是要根据任务的 耗时和cpu的繁忙度来计算4个左右只是个经验值你开10个短耗时的任务和几个长耗时任务的效率是不同的- -..一般来说估算这个量的最大效率估算公示是cpu核数*2-1,这个公式是当时对集群进行压测得到的结论.cpu抢占时间跟任务时长…开启这个数量的 线程可以最大化的榨干cpu一个道理。cpu不可能都被抢去做connection.iOS是cpu密集型的消耗?。这个大概知道就行了,也不会有人特 别在意吧…cpu核数2-1那个是做淘宝的java团队压测得到的线程最优数?,放在iOS上也多少适用…一般来说不超过这个量就好,线程不是起的越多越好,线程数就是…cpu来决定的
九. 什么是NSManagedObject模型
NSManagedObject是NSObject的子类 ,也是coredata的重要组成部分,它是一个通用的类,实现了core data 模型层所需的基本功能,用户可通过子类化NSManagedObject,建立自己的数据模型
十.简述NULL nil NIL NSNull的区别
- NULL是c语言中的空指针.
- nil是OC中指向空对象的指针
- Nil是OC指向类的空指针
- NSNull是数字或字典集合对象中表示空值对象.