В свете моего последнего вопроса я решил начать с простого класса, содержащего данные двумерного массива.
Интерфейс:
@interface DynamicTable
NSString ***data;
NSInteger _cols;
NSInteger _rows;
@end
Initializer:
-(id)initWithRows:(NSInteger)rows withCols:(NSInteger)cols {
if (self = [super init]) {
_rows = rows;
_cols = cols;
data = (NSString ***)malloc(_rows * sizeof(NSString **));
for (int i = 0; i < _rows; ++i) {
data[i] = (NSString **)malloc(_cols * sizeof(NSString *));
for (int j = 0; j < _cols; ++j) {
NSString *cell = [[NSString alloc] initWithFormat:@"%d",(i + j)];
data[i][j] = cell;
}
}
}
return self;
}
Мы сохраняем или нет?
В данный момент я провожу большую дискуссию со стажером (который раньше разрабатывал для iPhone, где я еще не занимался), не задал ли вопрос data [i] [j] = cell; не должно быть data [i] [j] = [сохранение ячейки]; .
Вторая версия пришла из другого примера здесь, на SO. С того же вопроса я скопировал процедуру dealloc.
Мы отпускаем по заданию?
Следующий бит кода отвечает за установку нового значения в данной ячейке. Опять же, возникает вопрос, стоит ли освобождать первоначальное значение (я уже понял, что это все по ссылке).
-(void)setValue:(NSString *)value atRow:(NSInteger)row atCol:(NSInteger)col {
//NSString *cell = data[row][col];
data[row][col] = value;
//[cell release];
}
Как видите, я закомментировал бит, который должен освобождать исходное значение.
Весь процесс управления памятью в iPhone выглядит довольно ужасно. Я много читал об этом на сайте Apple и других об этом, но это многое нужно принять сразу.
Маленькие примеры с ясным объяснением обычно работают лучше всего для меня. LOL
Вернуться к моему вопросу:
С моей точки зрения (не уверен, что я прав) я должен освободить исходное значение, которое было помещено в данную ячейку. Кто-нибудь может подтвердить, что я на правильном пути?
PS Я пытался использовать инструмент Run with Performance Tool -> Leaks ... Но и мое отсутствие знаний об iPhone слишком сильно сдерживает меня.