iOS基础知识自我记录

428 阅读4分钟

一、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:
  1. 如果属性没有手动实现setter和getter方法,编译器为你自动生成setter与getter方法
  2. 可以指定与属性对应的实例变量
  • 告诉编译器:属性的 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