iphone NSString Array - PullRequest
       0

iphone NSString Array

0 голосов
/ 11 июля 2010

Я объявил

NSString    *dayinfield[43];

и заполните его

-(void)DrawDemo {
dayinfield[2] = @"hallo";
dayinfield[3] = @"test";

// also i can read it
NSLog (@"show: %@",dayinfield[2]);
//works fine
}

, но когда мне нравится читать его содержимое в другой функции (того же класса)

-(void)ReadData
{
NSLog (@"show: %@",dayinfield[2]);
// I get random infos or “EXC_BAD_ACCESS
}

Как правильно инициализировать массив NSString, чтобы я мог получить доступ к его содержимому в каждой из моих функций ??

Спасибо, Крис

Ответы [ 4 ]

1 голос
/ 11 июля 2010

Если вы присваиваете литералы только элементам массива, это не должно быть проблемой.Но если вы используете другие строки, вам придется сохранять экземпляры вручную при использовании массива C.

Кстати: методы Objective C начинаются со строчной буквы.

0 голосов
/ 11 июля 2010

То, что у вас есть в ОП, должно работать, хотя это явное упражнение в мазохизме - использовать массивы С старой школы с объектами.

Я запустил этот код:

@interface TestClass : NSObject {
    NSString *a[1];
}
- (void) drawDemo;
- (void) readData;
@end 

@implementation TestClass

- (void) drawDemo{
    a[0]=@"A Zero";
    a[1]=@"A One";
}//------------------------------------- (void) drawDemo------------------------------------

- (void) readData{
    NSLog(@"a[0]=%@,a[1]=%@",a[0],a[1]);
}//------------------------------------- (void) readData------------------------------------

@end

TestClass *tc=[[TestClass alloc] init];
[tc drawDemo];
[tc readData];

... и получил такой вывод:

a[0]=A Zero,a[1]=A One

Ваша проблема в другом месте вашего кода.Нет веской причины использовать массивы C с объектами.Вы ничего не получаете, и вы должны наблюдать за ними, как ястреб, чтобы избежать ошибок.

0 голосов
/ 11 июля 2010

Это память, вероятно, освобождается до вашего второго вызова. Предполагая, что вы объявили dayinfield в качестве ивара (и тот факт, что вы не получаете плохой доступ все время), ваша строка не сохраняется должным образом.

Инициализируйте строки следующим образом:

dayinfield[2] = [[NSString alloc] initWithString:@"hallo"];
dayinfield[3] = [[NSString alloc] initWithString:@"test"];

и вы должны освободить их после освобождения класса (см. Руководство по управлению памятью ).

Кроме того, очевидно, что это зависит от того, что вы хотите сделать, но может быть проще, если вы используете NSArray вместо массивов C.

0 голосов
/ 11 июля 2010

Это произошло бы, если бы вы никогда не инициализировали массив (или его части, к которым вы обращаетесь) - если вы не вызывали -DrawDemo до -ReadData или использовали индексы, отличные от тех, которые опубликованы здесь, массив простосодержат значения мусора.

Попробуйте инициализировать содержимое массива в nil или @"" в вашем методе инициализатора и посмотрите, сохраняется ли проблема.

В качестве альтернативы рассмотрите возможность использования подходящего контейнера Какао.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...