在Objective C类中使用C数组是不好的做法吗?

时间:2014-04-18 02:37:46

标签: objective-c

我想知道在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

1 个答案:

答案 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