iphone 内存管理
2010-06-03 23:13:00 来源:WEB开发网(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
- ››iphone图片拉伸的几种方法
- ››iphone正则表达式的简单使用
- ››iPhone开发Unresolved Symbols CAKeyframeAnimati...
- ››IPhone开发-“此证书是由未知颁发机构签名”解决方...
- ››IPhone开发-整合私钥和证书,生成.p12文件
- ››iPhone应用开发-UIPickerView选取器详解
- ››iphone 获取屏幕的宽度和高度
- ››iPhone读取工程包中的二进制文件
- ››iPhone新手机 不挂YouTube APP
- ››iPhone 获取指定格式的时间和日期
- ››iPhone版PPS走进生活 观赏体验媲美PC版
- ››管理/var/spool/clientmqueue/下的大文件
更多精彩
赞助商链接