Доступ к свойствам объекта от делегата - PullRequest
0 голосов
/ 05 октября 2009

Я ломал голову над пробой, которая не совсем имеет смысла. Скажем, у меня есть следующее в моем проекте:

AppDelegate MyClassA MyClassB MyViewController

В MyClassA есть свойство типа MyClassB с именем classB. MyClassB имеет свойство типа NSMutableArray с именем указателя myArray.

Когда в MyViewController в viewDidLoad я создаю экземпляр MyClassA для доступа к myArray в его (MyClassA's) свойстве MyClassB, например:

MyClassA *classA = [[MyClassA alloc] init];
NSLog([NSString stringWithFormat:@"%i", [[[classA classB] myArray] count]);

Он будет отображать счет в журнале успешно и в то же время, дальнейший доступ к содержимому массива работает нормально.

Однако, все еще в MyViewController, когда MyClassA создается и получает доступ от делегата следующим образом:

AppDelegate *aDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSLog([NSString stringWithFormat:@"%i", [[[aDelegate classA] classB] myArray] count]]);

в журнале по-прежнему будет успешно отображаться счетчик, , но дальнейший доступ к содержимому в массиве не будет отображен без ошибок, кроме "Текущий язык: авто в настоящее время цель-c" - только одна строка из него .

Это странное поведение, которое я не могу понять. Есть ли разница между доступом к объектам, созданным в делегате, и доступом к объектам локально в функции (в viewDidLoad ViewController, как в примере) или чем-то другим?

Помощь очень ценится = D

1 Ответ

1 голос
/ 05 октября 2009

Похоже, что ваше приложение падает из-за доступа к уже освобожденной памяти. Если вы хотите изучить это подробнее, я рекомендую установить для переменной среды NSZombieEnabled значение YES (в настройках исполняемого файла XCode).

В этом конкретном случае было бы хорошо узнать, как именно инициализируется переменная-член classA делегата и как к ней осуществляется доступ. Может быть, любая переменная (будь то classA, classB или myArray) автоматически освобождается (или создается с помощью вспомогательного метода) и не сохраняется. После этого у вас будет доступ к этой переменной-члену до тех пор, пока в следующий раз пул автоматического выпуска не будет очищен.

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