2013-05-31 2 views
1

В моем основном проекте IOS я следующая ситуация:
В file1.m у меня есть:Как объявить массив стилей NSString * C в качестве глобальной переменной

NSString* s[] = {@"1", @"2", @"3", @"4"}; 

В file2.m у меня есть:

extern NSString** s; 

в том же file2.m метод ниже терпит неудачу с «непризнанным селектором„длиной“послали к экземпляру ':

- (void) someMethod { 
    int len = [s[0] length]; 
} 

Если я создаю новый демонстрационный проект и копирую код выше, все работает так, как ожидалось.
В чем может быть проблема с моим главным проектом? Я застрял здесь в течение 2 дней, пытаясь найти проблему.
Такая же проблема возникает с массивами int с той разницей, что я получаю сообщение об ошибке «плохого доступа» при попытке доступа к элементам в массиве, хотя отладчик XCode показывает содержимое массива просто отлично.

+5

Почему? Почему вы не можете использовать NSArray? –

+0

Когда вы запускаете в отладчике то, что s [0]? – Mark

+0

Для массива s отладчик отображает список адресов памяти, но не содержит содержимого строки, как если бы значения в массиве не были правильно инициализированы. – iPDFdev

ответ

1

Пожалуйста, убедитесь, что глобальное имя массива, объявленное с extern совпадает с именем массива, вы ссылаетесь в вызове length (то есть s в extern NSString** s; и [s[0] length] - это то же имя), и что нет другой переменной с именем s в области вызова length, которая будет «теневой» глобальной. Поскольку код работает отлично в меньшем проекте, наиболее вероятной возможностью является коллизия имен.

+1

На самом деле, используйте 'NSArray'. – bbum

0

С

extern NSString** s; 

вы просто объявить указатель на указатель на объект NSString, правильное заявление должно быть:

extern NSString *s[]; 
0

У меня есть некоторые идеи, что может быть там происходит.

  1. Вы где-то переписываете массив. Это всегда полезно, чтобы объявить постоянные массивы C с const

  2. Variable столкновением именем
    У вас есть два глобал с тем же именем, но разными объектами. Использование globals с именами вроде s может привести к столкновениям легко. Убедитесь, что использовать префиксы для глобал, точно таким же образом, как вы делаете для классов, перечислений и т.д.

+0

Downvoters, пожалуйста, комментарий – Sulthan

Смежные вопросы