background image
IOS 中的易混淆的知识点——北风教育课堂笔记 
 
一、堆与栈的区别 
栈  :是由系统自动分配释放的一块存储空间,存放函数的参数值,、局部变量等(数据类型,
以及定义的变量和对象的指针)
,类似于数据结构中的 
 
堆:一般由程序员自己手动释放,存放 OC 对象,程序员不手动释放,会到最够关闭程序时
对象才会被释放掉,分配方式类似于链表。 
 
二、instancetype 和 id 的区别 
instancetype :返回的指针指向的类型是已知的,不可以当方法的参数使用,只能作为返回值。
 
 
id:返回的指针指向的类型是未知,可以当做方法的参数使用,也是可以作为返回值 
 
三、MRC 与 ARC 的区别 
ARC:自动管理内存计数器。不需要程序员管理内存,编译器会在恰当的时候给我们填上
reatin、release 等代码。 
注意:oc 中的 ARC 和 JAVa 里面的垃圾回收机制不太一样,Java 中的垃圾回收机制是系统帮
忙干的,而 oc 中的 ARC 是编译器干的。 
 
ARC 是编译器特性(编译器会在恰当的时候给我们填上 reatin、release 等代码),不是运行
时特性。 
MRC:手动管理内存计数器。需要程序要自己恰当的地方自己写上 release 和 retain 代码。 
 
四、野指针和空指针的区别 
野指针:表示指针指向了一个被释放的对象,也成“僵尸对象”。只要给野指针发送消息,
程序就会报错。 
 
空指针:指向没有储存控件的指针(就是指针设置为 nil)。我们一般为了避免给野指针发送
消息,当一个对象被释放后我们都将这个对象的指针设置为空指针。给空指针发送消息不会
报错 
 
五、property 修饰符 
(1)readonly  :只读的,修饰的属性只自动生成 getter 方法 
(2)readwrite  :可读可写的,修饰的属性可以自动生成 getter/setter 方法。默认情况下是
readwrite  。 
(3)retain:自动帮我们生成 getter/setter 方法,并且生成的是内存管理代码(引用计数器
+1)
。 
(4)assign:不会自动帮助我们在 setter/getter 方法中生成内存管理代码,仅仅生成普通的 
 
六、getter 与 setter 方法 
getter:可以给 getter 方法起一个名字 
setter:可以给 setter 方法起一个名字