WEB开发网
开发学院手机开发iPhone 开发 iPhone 中的内存管理 阅读

iPhone 中的内存管理

 2010-03-17 20:57:00 来源:WEB开发网   
核心提示:(3) ? (id)retain:将调用该方法的对象的引用计数值加1,另外,iPhone 中的内存管理(2),名字中带有alloc, copy, retain 字样的函数,一般都会为引用计数值加1,会将引入的元素的引用计数值加1来获得所有权,而在元素被移除或者整个容器对象被释放时,这是一个在Cocoa中对方法的命名习惯

(3) ? (id)retain:将调用该方法的对象的引用计数值加1。

另外,名字中带有alloc, copy, retain 字样的函数,一般都会为引用计数值加1,这是一个在Cocoa中对方法的命名习惯。

释放对象所有权的方法

(1) ? (oneway void)release:负责将对象的引用计数值减1。如果对象的引用计数值减为0,则会调用该对象的dealloc方法,对该对象进行释放。

(2) ? (id)autorelease:某些情况下,我们并不想取得对象所有权,又不希望对象被释放,例如在一个函数中生成了一个新对象并返回:

- (NSString *)description {

NSString *desc = [[NSString alloc] initWithString:@"iPhone!"];

return (desc);

}

像其中的desc对象就是这种情况,description方法需要返回desc变量,所以不能释放它,但在方法之外又没有获取desc的所有权,无法释放。那么应该怎么办呢?

还记得前面的NSAutoreleasePool * pool吗?该对象被称为自动释放池,如果某个对象obj在自动释放池创建NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]与销毁[pool drain]之间使用[obj autorelease],则该对象就会被放在自动释放池中,表示会被自动释放,当自动释放池被销毁时,将该对象引用计数值减1。所以,我们可以对上面的 desc对象做如下修改,将它放到自动释放池中:添加[desc autorelease]语句或将用于初始化的一句改为[[[NSString alloc] initWithString:@"iPhone!"] autorelease]。

同时,对于没有使用上面讲的三个获得对象所有权方法的对象,将自动放在自动释放池中,如本章一开始的例子中的NSString *note1 = [NSString stringWithString:@"Running at 6 o’Clock"]中的note1对象。

自动释放池的效率并不高,所以在iPhone开发时,并不建议使用。

下面,来修改一下Note.m文件,这次所做的修改对于实际记录事情也许并没有多大意义,但它可以很好的帮助我们来理解内存的管理:(具体实例与解析请参看《iPhone应用程序开发指南(基础篇)》)。

其他注意事项

以上便是关于内存管理大体的方法,下面来看一些关于内存管理的细微之处与实际使用时的小技巧:

(1) 各种容器类如NSArray, NSDictionary, NSSet 等,会将引入的元素的引用计数值加1来获得所有权,而在元素被移除或者整个容器对象被释放时,释放容器内元素的所有权。

Tags:iPhone 内存 管理

编辑录入:coldstar [复制链接] [打 印]
赞助商链接