Массивы байтов как переменные-члены в Objective-C: почему значение не сохраняется? - PullRequest
0 голосов
/ 13 сентября 2010

Я уверен, что у меня есть основная проблема в моих знаниях Си. У меня есть одна переменная, определенная в @interface:

uint * theBytes;

и затем у меня есть метод для проверки значений этого массива.

- (IBAction) checkNow {
 NSLog(@"now? %d %d %d", theBytes[0], theBytes[1], theBytes[2]);
}

- (void)viewDidLoad {
    [super viewDidLoad];
 uint tryThis[3] = {72,2,244};
 theBytes = tryThis;
 [self checkNow];
}

Исходное значение checkNow отображает точные значения. Если я позвоню checkNow при нажатии кнопки позже, значения будут совершенно другими и странными.

Я могу сделать это с NSData довольно легко, но я бы хотел сделать это с прямыми массивами.

1 Ответ

2 голосов
/ 13 сентября 2010

Вы не можете назначить локальный массив указателю, который вы хотите закрепить после текущего кадра стека. Вы должны использовать динамическую память, полученную из malloc() или подобную функцию. Если вы хотите использовать байтовый массив, вам потребуется malloc(), memcpy() и free() памяти соответствующим образом каждый раз, когда вы хотите переназначить ее.

Например, это будет:

- (IBAction) checkNow {
 NSLog(@"now? %d %d %d", theBytes[0], theBytes[1], theBytes[2]);
}

- (void)viewDidLoad {
 [super viewDidLoad];
 uint tryThis[3] = {72,2,244};
 theBytes = malloc(3 * sizeof(uint));
 memcpy(theBytes, tryThis, 3 * sizeof(uint));
 [self checkNow];
}

// In order not to leak, you'll also need:

- (void)dealloc {
  free(theBytes);
  [super dealloc];
}

Да, работа с массивами Си - это боль. Вот почему этого обычно избегают на любом другом языке, даже близких родственниках, таких как C ++ и Objective-C.

...