iOS精品文章-面试iOS DeveloperiOS面试知识点收集

iOS面试题-每日十道-第九天

2016-07-14  本文已影响1103人  放肆肆肆

一. @property的本质是什么?ivar,getter.setter是如何生成并添加到这个类中的.

property在编译时编译器会自动的为我们生成一个私有成员变量和setter与getter方法的声明和实现.反编译property大致生成五个东西

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

@property有两个对应的词,一个是@synthesize,一个是@dynamic。如果@synthesize和@dynamic都没写,那么默认的就是@syntheszie var = var,var为property变量。可以手动修改属性var对应的实例变量。例如:@syntheszie var = var1

      @synthesize的语义是如果你没有手动实现setter方法和getter方法,那么编译器会自动为你加上这两个方法, 在Xcode4.4之后的版本可以省略不写.

      @dynamic告诉编译器不要自动生成成员变量的getter和setter方法,而是开发者自己手工生成或者运行时生成.

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

使用copy的目的是为了让本对象的属性不受外界影响,使用copy无论给我传入一股可变对象还是不可对象,我本身就是一股不可变副本.
如果使用strong.这个属性有可能指向一个可变对象,如果这个可变对象呗外部意外的修改了,由于可变对象呗改变之后起始地址不会发生变化.而strong修饰的属性依然会指向这块内存地址,下次读取的时候就会是被改变以后的对象了, 也就是说strong可能会被外部意外修改.

四. 属性readwrite,readonly,assign,retain,copy,nonatomic 各是什么作用,在那种情况下用?

一般使用nonatomic

五. 原子(atomic)跟非原子(non-atomic)属性有什么区别?

六. 在iOS应用中如何保存数据

七. 关键字volatile有什么含义?并给出三个不同例子

一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,
  优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

下面是volatile变量的几个例子:
  1) 并行设备的硬件寄存器(如:状态寄存器)
  2) 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
  3)多线程应用中被几个任务共享的变量

八. 一个指针可以是volatile么?解释为什么

可以是
尽管这种情况并不常见,但它还是可以,例如
当一个中断服务子程序企图去修改一个指向一个buffer指针的时候.

九. 谈谈obj - c的优缺点

优点

缺点

十. 堆和栈的区别

栈:向低地址扩展的数据结构,是一块连续的内存的区域。栈顶的地址和栈的最大容量是 系统预先规定好的,从栈获得的空间较小。
堆:向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。

上一篇下一篇

猜你喜欢

热点阅读