2010-05-23 4 views
0

я получаю Ошибку «EXC_BAD_ACCESS» при попытке доступа к переменному в функции, кроме того, он был установлен в'EXC_BAD_ACCESS' При попытке доступа к переменной?

переменный устанавливаются в функции «awakeFromNib»:

//Retrieve Session-ID 
sessionID = [self getSessionID]; 

и доступ в 'searchBtnClick':

NSLog(@"Commening search (%@)",sessionID); // This causes the error 

сама переменная защиту INED в заголовке:

NSString *sessionID; 

Может кто-то предложить, что может быть не так с этим?

Та часть, которая из getSessionID, которая возвращает значение:

NSString *pC = @""; 

// Separate Session ID 
pC = [initCookie substringFromIndex:10]; 
pC = [pC substringToIndex:32]; 

NSLog(@"Got session ID : %@",pC); 

return pC; 
+0

Проблема не в доступе к переменной; он пытается использовать мертвый объект. –

ответ

8

Ваш метод -getSessionID возвращает переменную с автоопределением - если вы попытаетесь снова получить доступ к указателю позже, строка уже освобождена и поэтому ссылка перестает быть действительной. Вы должны вызвать -retain на переменном при первом его получение, как это:

sessionID = [[self getSessionID] retain]; 

Затем, позже, в вашем классе -dealloc, вам необходимо сбалансировать сохранить с выпуском:

[sessionID release]; 
6

Если getSessionID следует нормальные конвенции какао, он возвращает объект autoreleased. Вы должны сохранить его, или sessionID станет обвисшим указателем, как только пул автозапуска будет удален (вероятно, в конце цикла событий).

Если вы новичок в Objective C и Cocoa, вы должны обязательно прочитать the Apple documentation about the memory model.

+0

... и как это сделать? –

+0

Справедливо ... [sessionID сохраняется]; –

+0

Это еще один хороший сайт для быстрого ввода/помощи ObjC и т. Д. http://cocoadevcentral.com/ – Justin

0

У меня была аналогичная проблема, она падает, когда вы не выделили какую-либо память. Отпустив его, как это:

UIImage *lObj_image = [UIImage imageNamed: @"bluebar.png"]; 

. 
. 
. 

[lObj_image release]; 

Проверить в вашем viewdidload()

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