何时保留 NSString?
当 NSString 对象作为参数传入时,我是否应该始终执行 retain
和 release
:
-forExample:(NSString*)str{
[str retain];
//do something
[str release];
}
?我应该在何时何地使用它?
When an NSString object is passed in as an argument, should I always do retain
and release
:
-forExample:(NSString*)str{
[str retain];
//do something
[str release];
}
or not? Where and when should I use this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
发布评论
评论(2)
狼亦尘2024-12-19 11:35:55
您永远不应该这样做,因为,就像一个优秀的开发人员一样,您要跟上 Objective-C 的最新趋势并使用 自动引用计数。自动引用计数无需手动调用保留/释放,并且随 LLVM 3.0 和 Xcode 4.2 一起提供。
如果出于某种原因,您想要像此处一样使用手动内存管理,则在大多数情况下不应手动调用 retain
和 release
。通常,可以根据自己的判断进行判断,而不是单独保留每个论点。
唯一一次这可能是个好主意是,如果您的方法在某个时刻调用回调或可能在您使用它之前释放参数的东西。例如,如果您的函数采用一个块并在执行期间调用该块,则可能会出现这种情况。如果该块释放作为参数传递的对象,然后您在调用该块后使用该对象,则该参数本质上是一个悬空指针。
此类场景的示例:
- (void)myFunction:(NSString *)foo block:(void (^)())callback {
[foo retain];
callback();
// .. do some stuff
[foo release];
}
- (void)myCallingFunction {
NSString * myVariable = [[NSString alloc] initWithString:@"Test"];
[self myFunction:myVariable block:^ {
[myVariable release];
}];
}
如您所见,代码 [myVariable release]
将在 // .. do some stuff
之前到达评论。
~没有更多了~
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
该对象的引用计数不会在此方法的过程中发生变化,因此没有理由将其发送
retain
。来自 Apple 的内存管理文章(你绝对应该看一下):仅当需要将对象保留在当前范围之外时,才需要保留该对象。
如果您保留了一个对象,那么当您不再需要它时,您需要发送它
release
。The reference count of that object isn't going to change over the course of this method, so there is no reason to send it
retain
. From Apple's Memory Management essay (which you should definitely look over):You only need to retain an object when you need it to stick around past the current scope.
If you have retained an object, you then need to send it
release
when you no longer need it.