内存管理:
1、一个对象的所有者可能不止一个。
2、你拥有通过alloc、new或copy(通过名字以“alloc”或“new”开头或名字中包含“copy”的方法)的对象的所有权。
3、如果向一个对象发送了一条retain
消息,则获得该对象的所有权。
4、需要向使用release或autorelease释放对象的所有权。
共享对象的有效性:
cocoa的所有权策略规定,被接受的对象通常在整个调用方法的作用域内保持有效。但有如下例外
1、若对象属于某集合,但该对象在集合中被删除。
obj = [array objectAtIndex:n]; [array removeObjectAtIndex:n]; // 此时obj是无效的
当对象从一个基本的集合中删除时,会向该对象发送一条release消息。如果集合是该对象的唯一所有者,则释放该对象。
2、当“父对象”被收回的时候
obj = [parent child]; [parent release]; // 此时obj是无效的
通常情况下,类内的属性都会在该类的dealloc方法中release掉,所以如果parent是obj的唯一所有者,parent在release的时候会释放掉obj的内存空间。
解决方法,在获取对象的时候调用retain方法即可:
obj = [[array objectAtIndex:n] retain];
Web视图:
1、如果需要结合客户端与webview进行开发,需要在html中加入以下meta,告诉safari整个页面的宽度(单位:像素)
<meta name="viewport" content="width=320"/>
其他:
1、把精力放在用户能够看得见的地方
2、多使用property,少声明成员变量
3、使用()作为Category,而不是(Private)的Category
4、dealloc写在@synthesize后面,可以较明显的一一对应
5、
错误:
[foo release]; foo = [newVal retain];
正确:
if (foo != newVal) { [foo release]; foo = [newVal retain]; }
简洁:
[foo autorelease]; foo = [newVal retain];
6、不要在viewDidLoad中初始化数据。viewDidLoad可能会被调用多次,而viewDidUnload可能不会被调用一次
7、NSNotificationCenter中注册多个通知后,要逐一remove掉,如果直接使用[[NSNotificationCenter defaultCenter] removeObserver:self]remove的话,可能会remove掉父类注册的通知,就算父类是UIViewController,也会remove掉父类的Memory Warning通知。
PS:学习笔记,遇到值得记录的东西,记录之