如果我将malloc与自动引用计数一起使用,我仍然需要手动释放内存吗?
int a[100];
int *b = malloc(sizeof(int) * 100);
free(b);
是的,您必须编写调用代码才能自己free
。但是,如果将指针放在引用计数对象的实例中,则指针可能会间接参与引用计数系统:
@interface MyObj : NSObject {
int *buf;
}
@end
@implementation MyObj
-(id)init {
self = [super init];
if (self) {
buf = malloc(100*sizeof(int));
}
}
-(void)dealloc {
free(buf);
}
@end
没有办法编写对free
的调用 - 无论如何,你必须在代码中使用它。
是的。ARC 仅适用于 Objective-C 实例,不适用于 malloc()
和 free()
。
NSData 的一些"NoCopy"变体可以与对 malloc 的调用配对,这将使您不必释放任何东西。
NSMutableData可以用作开销较高的calloc版本,它提供了ARC的便利性和安全性。
在 dealloc 中添加一个 if not nil 并分配给 nil 以确保安全。 不想释放 nil,malloc 可能会在 init 等之外使用。
@interface MyObj : NSObject {
int *buf;
}
@end
@implementation MyObj
-(id)init {
self = [super init];
if (self) {
buf = malloc(100*sizeof(int));
}
}
-(void)dealloc {
if(buf != null) {
free(buf);
buf = null;
}
}
@end