由于 Objective-C 是 C 的超集,因此可以将 malloc/free 与原始类型一起使用来创建 NxM 元素的矩阵。我不喜欢它,因为它可能会导致错误和内存泄漏。这最后一点仍然正确吗? ARC 是否提供 C 类型的发布?
int** matrix=(int**)malloc(N*sizeof(int*));
for(int i=0; i<N; i++)
matrix[i]=(int*)malloc(M*sizeof(int));
是否可以使用另一种 Objective-C 方式?我找到了 NSMatrix,但它适用于 mac,而不是 iOS。
最佳答案
Do ARC provide releasing of C types?
不,它没有。 ARC 代表自动引用计数,这意味着它仅适用于引用计数对象。
由于 malloc
/free
处理“普通”自由存储分配,因此您从 malloc
接收的内存块不符合 ARC 的条件。
然而,这并不意味着您无法通过在 ARC 上“搭载”来管理 malloc
分配的内存实现某种程度的自动化:
- 创建你自己的类,它有一个指向你的矩阵的实例变量,并在指定的初始化器中分配矩阵。
- 添加
dealloc
方法,在分配的内存块上调用free
。
现在您有了一个包含矩阵的引用计数类。每当 ARC 指示您的类取消分配时,矩阵持有的内存也会被释放:
@interface Matrix : NSObject
@property (nonatomic, readonly) int** data;
-(instancetype)initiWithRows:(NSUInteger)rows andColumns:(NSUInteger)cols;
-(void)dealloc;
@end
关于iOS:是否可以创建 NSObjects 矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29473719/