一、bounds和frame的区别
答:
frame:
- 以父控件左上角为原点。
- 描述可视范围
bounds:
- 以自己的左上角为原点,bounds x,y永远为0。
- 描述可视范围在内容的区域,所有子控件都是相对于内容,
- 修改内容原点
相对性:可视范围相对于父控件位置永远不变,可视范围相对于内容,位置改变。
二、setObject和setValue的区别
答:
setObject:
- object对象不能为nil,不然会报错;key的参数只要是对象就可以,并不局限于NSString
setValue:
- Value值可以为nil,此时会自动调用removeObject:forKey:方法;key的参数只能是NSString类型;
---建议使用setObject
三、懒加载使用问题
答:
优点:
- 懒加载使用得当,会提高内存性能
缺点:
- 使用泛滥,会导致crash,并且代码可读性太差。比如:只是创建一个UILabel的对象,使用懒加载创建,导致代码行数增加几行,从而增加代码量。。我觉得大可不必。
反思:自己在做项目的时候滥用懒加载,导致出现crash。花费很多时间查找问题原因,发现是懒加载的问题,让人感觉很无语。所以以后的项目中,不能滥用懒加载。虽然自己也不是很清楚什么时候该用懒加载,什么时候不使用懒加载的界限还没有太清楚。所以在以后多读大神的代码的时候,注意这方面的问题。以后明白了之后再来答这个问题。
四、对象创建方式的不同点
- new和alloc/init在功能上几乎是一致的,分配内存并完成初始化。
差别在于:
- 采用new的方式只能采用默认的init方法完成初始化,
- 采用alloc的方式可以用其他定制的初始化方法
五、成员变量、实例变量、属性变量、局部变量、全局变量的概念
- 成员变量:定义在{}号中的变量,用于类内部,无需与外界接触的变量。
- 实例变量:如果成员变量的数据类型是一个类则称这个变量为实例变量
- 属性变量:有前缀
@property
- 局部变量:局部变量是根据其生存周期定义的,其生命周期是在以“{ }”为界限的代码块中,虽然它的名称与成员变量相同,但不是同一个变量。
- 全局变量:在@implementation外定义的变量
六、@property、@synthesize、@dynamic本质
- @property:ivar + getter + setter;
- @synthesize:
- 如果属性没有手动实现setter和getter方法,编译器为你自动生成setter与getter方法
- 可以指定与属性对应的实例变量
- 告诉编译器:属性的 setter 与 getter 方法由用户自己实现,不自动生成
七、重写getter和setter方法注意事项
- 只重写getter(懒加载**)**:默认会自动生成下划线开头的变量,在getter中要使用下划线(return _var)来返回值,不能使用self.否则造成死循环
- 只重写setter:默认会自动生成下划线开头的变量,在setter中要使用下划线( _var = var)来接收值,不能使用self.否则造成死循环
- 两个都重写 :同时手动重写了一个属性的get和set方法的话,Xcode不会再自动生成带有下划线的私有成员变量了这时如果不加,@synthesize就会报错,解决方法就是添加@syntheszie var = _var
- readonly 和 writeonly情况下重写:这时属性只会生成getter或者setter方法,如果我们重写了该方法,就需要我们重新添加@synthesize
八、self.xxx和_xxx的区别
- self.xxx是调用的xx属性的get/set方法
- __xxx则只是使用成员变量_xxx,并不会调用get/set方法。
- 两者的更深层次的区别在于,通过存取方法访问比直接访问多做了一些其他的事情(例如内存管理,复制值等),例如如果属性在@property中属性的修饰符有retain,那么当使用self.xxx的时候相应的属性的引用计数器由于生成了setter方法而进行加1操作,此时的retaincount为2