Jör*_*son 6 memory-management objective-c retain
我是Objective-C的新手,所以这可能是一个愚蠢的问题.
我不禁看到ObjC和微软的COM在内存管理方面的相似之处(AddRef/ Releasevs retain/ release).在COM环境中,在将对象返回给调用者之前,或多或少地强加给你始终AddRef(retain)一个对象.从我到目前为止看到的(我是Mac®OSX(第3版)的Cocoa®编程的第三部分),内存管理部分有些模糊.
假设没有GC,返回对象的惯用方法是什么?
ham*_*ene 12
阅读关于自动释放池的内存管理编程指南.
在Objective-C中,按照惯例,对象应该被自动释放(除非返回对象的方法的名称以"alloc","new","copy"或"mutableCopy"开头).自动释放的对象由池中的Objective-C跟踪并自动处理,这意味着您无需关心向它们发送最终版本.与COM相比,这极大地简化了引用计数,这就是为什么release在大多数情况下您没有看到对返回对象的任何调用.相反,相同的约定指定由名称以alloc,new,copy或mutableCopy开头的方法返回的所有对象都是方法调用者的责任.您必须手动调用这些对象的释放,否则您的程序将出现内存泄漏.
可可绕到的局限性AddRef/ ReleaseCOM中通过引入第三同级; autorelease.
retain - 我需要这个,让它坚持下去.release - 我不再需要它了,你可以立即删除它.autorelease - 我不需要这个,但是让它保持几秒钟,以防其他人想先拿起它.这个微小的添加允许大多数返回值作为处理- 如果我们有垃圾收集.如果您对保持返回值不感兴趣,请不要做任何额外的事情.
为了使这个工作有一个约定(一个足够好的约定让编译器为即将到来的ARC自动为你做内存):
alloccopynewretain关于如何在实践中应用它的三个示例实现:
-(NSString*)newHelloWorldString {
NSString* s = [NSString stringWithString:@"Hello world"];
// Apply retain because s in now autoreleased
return [s retain];
}
-(NSString*)helloWorldString {
NSString* s = [[NSString alloc] initWithString:@"Hello world"];
// Apply autorelease because s is now retained.
return [s autorelease];
}
-(NSString*)fullName {
// No memory management needed, everything is autoreleased and good.
NSString* fn = [self firstName];
NSString* ln = [self lastName];
NSString* s = [NSString stringWithFormat:@"%@ %@", fn, ln];
return s;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8496 次 |
| 最近记录: |