我想知道在Objective-C类中使用带有纯C数组的alloc / free有什么缺点吗? 例如:
#import "CVPatternGrid.h"
@implementation CVPatternGrid
@synthesize row = _row;
@synthesize column = _column;
@synthesize count = _count;
@synthesize score = _score;
- (id)initWithRow:(NSInteger)row column:(NSInteger)column {
if (self = [super init]) {
_grid = [self allocateNewGrid:row column:column];
}
return self;
}
- (NSInteger)moveCount {
return _count;
}
- (bool**)allocateNewGrid:(NSInteger)row column:(NSInteger)column {
bool **p = malloc(row * sizeof(bool*));
for (int i = 0; i < row; ++i) {
p[i] = malloc(column * sizeof(bool));
}
return p;
}
- (void)generateNewGrid:(NSInteger)row column:(NSInteger)column {
[self freeGrid];
_grid = [self allocateNewGrid:row column:column];
_count = [self.algorithmDelegate generateGrid:_grid];
_score = _count * 100;
}
- (BOOL)isMarkedAtRow:(NSInteger)row column:(NSInteger)column {
return YES;
}
- (void)freeGrid {
for (int i = 0; i < _row; ++i) {
free(_grid[i]);
}
free(_grid);
}
- (void)dealloc {
[self freeGrid];
}
@end
答案 0 :(得分:0)
在Obj-C类中使用C数组是完全正常的。 Obj-C中没有低级数据类型 - 每个类,包括NSArray,NSString等,都在内部使用原始C类型。
但是你做错了一些事情:
除非您需要,否则请勿使用@synthesize
。在这种情况下,您不需要它,因此请删除这些代码行。
除非你需要,否则不要使用_foo
来访问变量,在这种情况下你不需要在任何用例中使用它(除了可以说,在你的init和dealloc方法中。但我会认为它甚至不应该在那里使用。其他人不同意我的意见)。我的规则是在使用_foo
语法时遇到性能问题时仅使用self.foo
。还存在边缘案例问题,例如KVO,在init / dealloc中使用访问器时可能会遇到问题。在现实世界中,在写作Obj-C超过10年的时间里,我从未遇到任何边缘情况 - 我总是使用访问器,除非它们太慢。
有关如何声明C数组@property
的一些实现细节:Objective-C. Property for C array