сообщение отправлено на освобожденный экземпляр! не могу найти ошибку - PullRequest
0 голосов
/ 20 мая 2011

хорошо, я ищу эту ошибку с 2 часов, и я просто не могу понять это, пожалуйста, помогите мне.У меня следующая ситуация у меня 2 viewcontroller.один представляет другой как modalview вот так.

SearchViewController *searchViewController = [[SearchViewController alloc]init];
[searchViewController setModalTransitionStyle:UIModalTransitionStyleCoverVertical];
searchViewController.delegate = self;
searchViewController.senderTag = [sender tag];
[self presentModalViewController:searchViewController animated:YES];
[searchViewController release];

в моем searchviewcontroller Я делаю это в .h файле

BSKmlResult *selectedAirport;
@property (nonatomic, retain) BSKmlResult *selectedAirport;

в файле .m я синтезирую его и затем устанавливаюэто так

selectedAirport = [self.airportList objectAtIndex:indexPath.row];

и затем отпустите его здесь

- (void)dealloc {
  [selectedAirport release];
  [super dealloc];
}

в методе делегата моего SearchViewController, который реализован в первом viewcontroller, где я также представляю SearchViewController, у меня есть следующее

if (controller.selectedAirport) {
            if (departureAirport) {
                [departureAirport release];
            }

        departureAirport = [controller.selectedAirport copy];
}

[self dismissModalViewControllerAnimated:YES];

Я сузил, где происходит ошибка, она находится в свободном месте моего SearchViewController [selectedAirport release];

, но я не могу понять, где моя ошибка, пожалуйста, помогите

Ответы [ 3 ]

9 голосов
/ 20 мая 2011
selectedAirport = [self.airportList objectAtIndex:indexPath.row];

Вы не сохраняете выбранный аэропорт здесь.

Измените его на

self.selectedAirport = [self.airportList objectAtIndex:indexPath.row];

Поскольку вы не смогли его найти, возможно, вы этого не знаете ...

Если вы не обращаетесь к переменным-членам через self.memberVariable, вы не получаете доступ к его свойству.Таким образом, это не было сохранено.

Конечно, вы также можете сохранить его, сказав

selectedAirport = [[self.airportList objectAtIndex:indexPath.row] retain];

Но какова тогда польза от вашей собственности ...

3 голосов
/ 20 мая 2011

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

 self.selectedAirport = [self.airportList objectAtIndex:indexPath.row];
2 голосов
/ 16 июля 2011

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

Например, в .h файле вы можете иметь следующую реализацию:

NSString *_selectedAirport;

затем заключите его в свойство, как показано ниже

@property(nonatomic,retain) NSString *selectedAirport;

и в файле реализации .m синтезируйте его, как показано ниже:

@synthesize selectedAirport = _selectedAirport;

Выполните выше, если вы пытаетесь получить к нему доступ, как показано ниже

selectedAirport = [self.airportList objectAtIndex:indexPath.row];

тогда это приведет к ошибке, и вам будет предложено использовать self.selectedAirport.

Также в этом случае ваш метод dealloc может иметь либо

self.selectedAirport = nil;

или

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