Настоящий вопрос о контроллере - PullRequest
0 голосов
/ 01 сентября 2011

A -> B subview (viewcontroller.view) -> Presentmodalviewcontroller (C)

Моя вторая страница: (B) код

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{            

[currentElement release];  
currentElement = [elementName copy];  


if ([elementName isEqualToString:@"result"] ) {  

    Prodid = [[NSMutableString alloc] init];  

        }  
}  
  • (пусто) parserDidEndDocument: (NSXMLParser *) parser {page * login = [[alloc alloc] init];
    login.prodid = Prodid;
    login.categid = self.categid;
    UINavigationController * navCtrl = [[UINavigationController alloc] initWithRootViewController: login];
    [self presentModalViewController: navCtrl animated: YES];
    [login release];
    [navCtrl release];
    [Продвинутая версия];
    }

на моей следующей странице (C) есть одна кнопка отмены

-(void) cancel  
{  
    [self dismissModalViewControllerAnimated:YES];  
}  

, если я нажимаю кнопку отмены, приложение вылетает. Я проверяю nszombie и нахожу перевыпущенный объект (Prodid).Если я удаляю [Prodid release], приложение работает, но в Prodid просачивается. Как я могу решить эту проблему.

Ответы [ 4 ]

1 голос
/ 01 сентября 2011
if ([elementName isEqualToString:@"result"] ) {  

    Prodid = [[NSMutableString alloc] init];  

        }  
} 
[Prodid release];

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

if ([elementName isEqualToString:@"result"] ) {  

    Prodid = [[NSMutableString alloc] init];  

}
else
{
    Prodid = nil;
}
[Prodid release];
Prodid = nil;

Это будет работать, потому что сообщения, отправленные на nil, ничего не делают.

0 голосов
/ 01 сентября 2011

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

Думайте об этом так: представление контроллера модального представления дает своего рода владение.Ваш второй контроллер вида ВЛАДЕЕТ первым контроллером вида и ничего НЕ СОБИРАЕТСЯ.Поэтому вызов '[self dismissModalViewControllerAnimatied: YES]' завершается неудачно, потому что второй контроллер представления НЕ ИМЕЕТ модальный контроллер представления.

Как правило, в этой ситуации я установил какое-то отношение делегата между«базовый» вид контроллера и модальный.Вы также можете добавить цель к кнопке отмены из «базового» контроллера вида при настройке.

Может быть так:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{             
    [currentElement release];   
    currentElement = [elementName copy];   
    if ([elementName isEqualToString:@"result"] ) {   
        Prodid = [[NSMutableString alloc] init];   
    }   
    page *login=[[page alloc]init];   
    login.prodid = Prodid;   
    login.categid=self.categid;   
    UINavigationController *navCtrl= [[UINavigationController alloc] initWithRootViewController:login];   
    [[login cancelButton] addTarget:self action:@selector(cancel) forControlEvents:UIControlEventTouchUpInside];

    [self presentModalViewController:navCtrl animated:YES];   
    [login release];   
    [navCtrl release];    
}

-(void) dealloc   
{    
    [Prodid release];   
}   

// Put this method in the "base" view controller, NOT the modal one
-(void) cancel   
{   
    [self dismissModalViewControllerAnimated:YES];   
}  
0 голосов
/ 01 сентября 2011

Ваш код странный, что произойдет, если ваше elementName! = @ "Result", каково значение Prodid в этом случае?

Я думаю, вам нужно установить Prodid = nil после его выпуска:1003 *

[Prodid release];
Prodid = nil;
0 голосов
/ 01 сентября 2011

Вы должны выбрать в отладчике ту часть кода, где произошло сбой вашего приложения. Из вашего описания я предполагаю, что вы пытаетесь отправить сообщение dismissModalViewController в navCtl, а не его владельцу.

[self.parentViewController dismissModalViewControllerAnimated:YES];
...