首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

obj-c学习札记

2012-07-30 
obj-c学习笔记内存管理:? ? 1、一个对象的所有者可能不止一个。? ? 2、你拥有通过alloc、new或copy(通过名字以

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

热点排行