Ошибка: EXC_Bad_Access при доступе к retainCount объекта - PullRequest
0 голосов
/ 26 апреля 2011

В файле заголовка .h

@interface MemoryAppDelegate:NSObject <UIApplicationDelegate> {
Class1 *class1_obj;
}

В файле реализации .m

@implementation Memory : (UIApplication*) application
{
 NSLog(@"Retain Count of class1_obj %d",[class1_obj retainCount]); //ouput retainCount is 0
 Class2 *class2_obj;
 NSLog(@"Retain Count of class2_obj %d",[class2_obj retainCount]); // gives EXC_Bad_Access error

Как и в приведенном выше коде, когда я объявляю объект в файле заголовка и пытаюсь получить к нему доступсчетчик сохранения дает мне 0. Но если я объявляю объект в файле реализации и обращаюсь к его retainCount, он выдает Bad_Access.Пожалуйста, вы можете сказать, почему эта ошибка возникает?

Ответы [ 3 ]

2 голосов
/ 26 апреля 2011

Прежде всего: вы не должны получать доступ к какому-либо объекту retaincount в вашем приложении.

Чтобы ответить на ваш вопрос:

  • object1 - переменная экземпляра, она указывает на nil, когда она не инициирована. Когда вы отправляете сообщение на nil, оно возвращает nil (здесь, 0).
  • object2 - это указатель, который не был установлен ни для чего, даже для nil, поэтому он может указывать на что-либо. Здесь он указывает на несуществующий объект, поэтому он падает.
2 голосов
/ 26 апреля 2011

Не знаю, зачем вы все это делаете, но этот код:

 Class2 *class2_obj;
 NSLog(@"Retain Count of class2_obj %d",[class2_obj retainCount]); // gives EXC_Bad_Access error

Создает только указатель на объект определенного типа, но не создает экземпляр. Таким образом, доступ к нему и запрос его retainCount (что вы не должны делать в первую очередь) приведут к действительному сбою. Потому что это недопустимый объект (пока). Попробуйте сначала инициализировать его.

UPDATE: если вы настаиваете на этом, вот что может сработать

Class2 *class2_obj = [[Class2 alloc] init];
NSLog(@"Retain Count of class2_obj %d",[class2_obj retainCount]); // gives retain count of 1
[class2_obj release];
0 голосов
/ 26 апреля 2011

Потому что, когда вы объявляете его в классе как переменную экземпляра, он автоматически инициализируется nil[nil retainCount] снова возвращает nil, что равно 0 при печати в виде целого числа (%d)

Но переменная, которая объявлена ​​локально, не инициализируется, и такой указатель указывает куда-то, скорее всего,блок памяти, который не выделен.И поскольку попытка получить доступ к области памяти, которая не выделена, приводит к EXC_BAD_ACCESS, вы получаете ошибку, которую вы описали.

...