Область применения NSArray в Objective- C - PullRequest
0 голосов
/ 14 апреля 2020

В файле GLViewController.m

В самом начале реализации

NSArray* imageArray ;

Затем в GLViewController.m внутри GLViewController

- (id)initWithCoder:(NSCoder*)coder 
{
 imageArray  = @[ @"baban.jpg",@"cete.jpg",@"cipan.jpg",@"kuc.jpg"];
}

Внутри drawView в GLViewController. m

NSLog(imageArray[0]);  //Fails

Я также объявил это в файле GLViewController.h:

NSArray* imageArray;

Я включил GLViewController.h в GLViewController.m

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

- (id)initWithCoder:(NSCoder*)coder устарел и не будет вызываться. Вместо этого используйте - (instancetype)init. Также вы можете сделать это следующим образом:

В файле .m:

@interface YourClassName ()
@property (nonatomic, copy) NSArray *imageArray;
@end

@implementation YourClassName

- (NSArray *)imageArray {
   if (!_imageArray) {
      _imageArray = @[@"baban.jpg", @"cete.jpg", @"cipan.jpg", @"kuc.jpg"];
   }
   return _imageArray;
}

// now you can access your array as `self.imageArray` anywhere in this class

@end
0 голосов
/ 16 апреля 2020

Ваш вопрос не ясен. Например, вы объявили imageArray как переменную экземпляра, глобальную переменную или, возможно, и то и другое - «В самом верху реализации» можно прочитать как «начало файла», «верх реализации чуть ниже @implementation в скобках» et c.

Итак, мы предполагаем, будем надеяться, что это поможет.

Во-первых, из того, что вы сообщаете; что init запускается, но в методе экземпляра и доступе к переменным экземпляра "не удается" каким-то неуказанным способом; Вы можете иметь две разных переменных, объявленных в разных областях. Без минимального воспроизводимого примера 1012 * мы не можем быть более точным c. Что вы можете попробовать, это вставить:

NSLog(@"Loc A imageArray @%p = %p", &imageArray, imageArray);

в различных местах, где вы меняете «A» (на «B», «C» ...) для каждого, где вы находитесь доступ imageArray. Будет напечатан адрес самой переменной, из которого вы можете определить, всегда ли вы ссылаетесь на одну и ту же переменную , а содержимое переменной - как адрес, по которому вы можете определить, изменяется ли значение, т.е. это nil или массив, на который он ссылается, изменился.

Во-вторых, вы пишете: «Я тоже объявил его в файле GLViewController.h». Обычно вы не объявляете переменные экземпляра в файле .h, хотя можете, и вы не повторно объявляете глобальные переменные в .h, и это должно привести к ошибке компилятора - вы не ' не сообщать о такой ошибке, которая приводит к описанной выше возможности, что у вас может быть две переменные в разных областях.

Если вы будете sh объявлять глобальную переменную в file.m и чтобы он был доступен для другого кода в другом файле, тогда в file.h вы включаете для него объявление extern:

extern NSArray* imageArray;

extern утверждает, что эта строка не объявляет саму переменную, а что переменная объявлена ​​в другом месте и доступна. (Вас может удивить, почему вы не добавляете extern к функциям / методам, в этих случаях extern неявно.)

Надеюсь, что это поможет каким-то образом. Если это совсем не помогает, я предлагаю вам задать совершенно новый вопрос, содержащий более подробную информацию, минимальный воспроизводимый пример и т. Д. c. (Если вы сейчас редактируете этот вопрос, люди могут пропустить изменения, думая, что видели вопрос.) Вы всегда можете удалить этот вопрос, чтобы уменьшить беспорядок.

...