obj-c学习笔记
内存管理:
? ? 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:学习笔记,遇到值得记录的东西,记录之