您的位置:首页 > 移动开发 > IOS开发

iOS笔试题目

2015-07-25 15:41 357 查看
1.属性与成员变量

(1) readwrite,readonly,assign,retain,copy,nonatomic属性的作用

答:@property是一个属性访问声明,扩号内支持以下几个属性:

getter=getName,setter=setName,设置setter与getter的方法名

readwrite,readonly,设置可供访问级别

assign,setter方法直接赋值,不进行任何retain操作,为了解决原类型与环循引用问题

retain,setter方法对参数进行release旧值再retain新值,所有实现都是这个顺序(CC上有相关资料)

copy,setter方法进行Copy操作,与retain处理流程一样,先旧值release,再Copy出新的对象,retainCount为1。这是为了减少对上下文的依赖而引入的机制。

nonatomic,非原子性访问,不加同步,多线程并发访问会提高性能。注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。锁被加到所属对象实例级(我是这么理解的…)。

(2)copy与retain的区别

copy: 建立一个索引计数为1的对象,然后释放旧对象

retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1

那上面的是什么该死的意思呢?

copy其实是建立了一个相同的对象,而retain不是:

比如一个NSString对象,地址为0×1111,内容为@”STR”

Copy到另外一个NSString之后,地址为0×2222,内容相同,新的对象retain为1,旧有对象没有变化

retain到另外一个NSString之后,地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值+1

也就是说,retain是指针拷贝,copy是内容拷贝。哇,比想象的简单多了…

(2) 在一个对象的方法里面:self.name= “object”;和_name =”object”有什么不同吗?

答:self.name =”object”:会调用对象的setName()方法;

_name = “object”:会直接把object赋值给当前对象的name属性。

(3) 请简述self.name=nil的机制,以及与[name release]的区别?

答: self.name =nil; //使用nil参数调用setName:方法

[name release]生成的访问器将自动释放以前的name对象

2.宏定义

(1) 用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)

答:#define SECONDS_PER_YEAR (unsigned long)(60
* 60 *24
*365)

能想到转换为无符号长整型,需要比较扎实的基础

(2) 写一标准MIN,这个宏输入两个参数并返回较小的一个

答:懂得在宏中小心地把参数用括号括起来

我也用这个问题开始讨论宏的副作用。

例如:当你写下面的代码时会发生什么事?
least = MIN(i++, b);
结果是:
((i++) <= (b) ? (i++) :(b))

这个表达式会产生副作用,i会作两次++自增操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: