EXC_BAD_ACESS при доступе к строке - PullRequest
0 голосов
/ 25 августа 2011

Я определил @property(nonatomic,retain)NSString *usrId; затем присваивается значение, подобное этому:

usrId=[Screen.Info valueForKey:@"id"];

Затем в dealloc я освобождаю строку usrId. Этот код находится в viewController, который я перевожу на navController, затем я высовываю его. Но в следующий раз, когда я снова нажму на viewController, в приведенном выше утверждении произойдет EXC_BAD_ACESS.

Ответы [ 3 ]

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

Никогда освободить объект, если вы его не распределили или не сохранили.Когда вы пишете:

NSString *usrId = [Screen.Info valueForKey:@"id"];

Вы просто даете ссылку на нее, не выделяете и не сохраняете ее.Таким образом, вы можете либо использовать одно из следующих действий, затем отпустить в dealloc, либо вы вообще не должны выпускать его.

NSString *usrId = [[NSString alloc] initWithString:[Screen.Info valueForKey:@"id"]];

NSString *usrId =[[Screen.Info valueForKey:@"id"] retain];
1 голос
/ 25 августа 2011

Попробуйте присвоить значение как

self.usrId = [Screen.Info valueForKey:@"id"];

или

usrId = [[Screen.Info valueForKey:@"id"] retain];

Делая это, как вы делаете, вы просто присваиваете значение usrId для [Screen.Info valueForKey:@"id"], поэтому, когда вы отпускаете его в dealloc, вы освобождаете все, что также хранится в [Screen.Info valueForKey:@"id"]. Дайте мне знать, если это работает для вас.

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

Использование usrId напрямую использует iVar, а не свойство, поэтому оно не сохраняется должным образом. Вам необходимо использовать синтаксис точка , поэтому измените его на self.usrId = [Screen.Info valueForKey:@"id"];, чтобы использовать свойство.

...