(21)用通用指针id接受一个对象后,要调用该对象的方法时不需要将id类型强制转换。
(22)重写init方法时,需要调用self=[super init];是固定写法。而且应该再后面增加一个判断if(self!=nil){},即只有父类初始化正常不反悔nil,才继续执行。死记硬背吧。优化写法就是if(self=[super init]){}。一般重写init,就似乎为了给某些属性固定值。
(23)类也不能互相在.h文件中#import导入。但可以利用@Class Person;代替(该语句仅仅是告诉编译器Person是一个类,这样就不会报错),且后者效率更高,在开发大型项目时会用到。有时候一般是在.h文件中用@Class ***,在.m文件中#import “***.h”,因为如果不导入的话,在.m中无法使用那个类的方法。
(24)所谓的内存管理:基本数据类型都是存放在栈中,作用域结束就自动失效。对象指针也是存放在栈中的,但对象指针指向的对象是存在堆中的,如果在作用域结束之前没有回收内存,那么对象指针被失效后,在堆中就会存在一个没有被回收的对象继续占用内存。
(25)当一个对象被回收时会调用类的dealloc方法,我们可以在重写这个dealloc方法。在重写时约定俗成在最后加[super dealloc];语句。
(26)当指针指向的对象引用计数为0时就会被销毁,那么此时这个指针就是一个野指针,因为它指向一个不存在的内存空间。
(27)一般如果有新的指针指向一个对象时们应该用retain为对象引用计数加1,否则直接指向的话,会有2个指针指向这个对象,但是其引用计数只有1,release一次就会出错。
(28)如果严谨一些的代码在对象指针release后,会把相应地对象指针设置为nil空值。
(29)用@property时候()里面:如果是OC对象类型则用retain/copy,基本数据类型就用assign。就是用到内存管理规则。
(30)系统自带的方法:如果不包含alloc、copy等,那么它们返回的对象都已经被autorelease过了。我们可以在创建对象的时候快速创建一个autorelease对象,这样别人在调用我们的对象时就不用考虑release的问题,此时创建最好用self而不用类名。 |
|