iPhone - доступ к NSArray в ViewController из AppDelegate? - PullRequest
0 голосов
/ 04 августа 2011

Я хочу иметь доступ к массиву объектов в моем приложении для iPhone. Массив объектов заполняется в appDelegate моего приложения, и я хочу иметь возможность доступа к массиву в одном из моих контроллеров представления.

В настоящее время я настроил массив в своем файле appDelegate.h следующим образом:

NSArray *listObjArray;
@property (nonatomic, retain) NSArray *listObjArray;

Затем я заполняю его некоторыми строками в AppDelegate:

listObjArray = [NSArray arrayWithObjects:@"Hello", @"How", @"are", nil];
NSLog(@"Array size = %i", [listObjArray count]);

Синтезируется и выпускается в dealloc. NSLog возвращает правильный счет здесь.

В своем классе ViewController я импортирую appDelegate следующим образом:

#import "MyaAppDelegate.h"

Затем я получаю доступ к своему appDelegate и NSArray, как это, и пытаюсь записать счет в моем View Controller:

MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] 
                                       delegate];

NSLog(@"Before array set");
NSArray *newArray = [appDelegate listObjArray];
NSLog(@"After array set");
NSLog(@"array count = %i", [newArray count]);
NSLog(@"After array count");

Запись в журнале происходит до «После установки массива», а затем я получаю «EXC_BAD_ACCESS» в строке, где я пытаюсь распечатать счет из массива в View Controller.

Печать счетчика работает нормально из appDelegate и установка newArray, так как кажется, что массив из делегата работает, но я ничего не могу с этим поделать.

Кто-нибудь может увидеть, что я делаю не так?

Ответы [ 4 ]

2 голосов
/ 04 августа 2011

Я думаю, что ваше объявление массива должно быть:

NSArray *newArray = [[NSArray alloc] initWithArray:appDelegate.listObjArray]

Обязательно отпустите его после того, как вы закончите! Хотя я не уверен, почему вы хотите объявить новый массив, вы можете просто сделать:

NSLog(@"array count = %i", [appDelegate.lstObjArray count]);

Надеюсь, это поможет!

-Karoly

1 голос
/ 04 августа 2011

У вас проблема с памятью: listObjArray = [NSArray arrayWithObjects:@"Hello", @"How", @"are", nil]; устанавливает переменную экземпляра напрямую. Вскоре после этой строки массив снова освобождается, в результате чего вы получаете доступ к неправильной ячейке памяти в NSArray *newArray = [appDelegate listObjArray];, поскольку он был освобожден.

Используйте self.listObjArray = ... вместо этого при заполнении массива. Это правильно сохранит объект для вас.

1 голос
/ 04 августа 2011

Попробуйте это

self.listObjArray = [NSArray arrayWithObjects:@"Hello", @"How", @"are", nil];

Распределение должно быть сделано на геттере.

1 голос
/ 04 августа 2011

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

Также вам следует использовать функцию сохранения или копирования, если вы хотите сохранить или скопировать ее. В противном случае newArray и listObjectArray будут указывать на одно и то же место в памяти, вызывая плохое поведение.

NSArray * newArray = [[appDelegate getListObjArray] retain];

...