`

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:学习笔记,遇到值得记录的东西,记录之

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics