NSXMLParser множественный вызов - плохой доступ - PullRequest
0 голосов
/ 17 марта 2011

привет, я хочу разобрать html с этой информацией другой html файл ... после 1-5 вызова программа вылетает ...

Заголовок:

#import <UIKit/UIKit.h>

@interface FirstViewController : UIViewController <ZBarReaderDelegate, NSXMLParserDelegate>{

    UIImageView *resultImage;
    UITextView *resultText;
    NSString *product_link;
    NSXMLParser *parseHTML;
    NSXMLParser *parseHTML2;
    NSMutableArray *myMutableArray;
    id <NSXMLParserDelegate> testkollege, asdf;
}
@property (nonatomic, retain) IBOutlet UIImageView *resultImage;
@property (nonatomic, retain) IBOutlet UITextView *resultText;
@property (nonatomic, assign) IBOutlet NSString *product_link;
@property (nonatomic, assign) NSXMLParser *parseHTML;
@property (nonatomic, assign) NSXMLParser *parseHTML2;
@property (nonatomic, retain) NSMutableArray *myMutableArray;
@property (nonatomic, assign) id <NSXMLParserDelegate> testkollege;
@property (nonatomic, assign) id <NSXMLParserDelegate> asdf;
- (IBAction) scanButtonTapped;

@end

м-файл:

#import "FirstViewController.h"
#import "/System/Library/Frameworks/Foundation.framework/Headers/NSDebug.h"

@implementation FirstViewController
@synthesize resultImage, resultText;
@synthesize product_link;
@synthesize parseHTML, parseHTML2;

@synthesize myMutableArray;
@synthesize testkollege, asdf;

bool link_is_here = false;
bool allergy_is_here = false; 
bool parse_one_ok = true;

- (void) imagePickerController: (UIImagePickerController*) reader
 didFinishPickingMediaWithInfo: (NSDictionary*) info
{

    // ADD: get the decode results
    id<NSFastEnumeration> results = [info objectForKey: ZBarReaderControllerResults];
    ZBarSymbol *symbol = nil;
    for(symbol in results)
        // EXAMPLE: just grab the first barcode
        break;

    // EXAMPLE: do something useful with the barcode data
    resultText.text = symbol.data;    
    // EXAMPLE: do something useful with the barcode image
    resultImage.image =
    [info objectForKey: UIImagePickerControllerOriginalImage];

    // ADD: dismiss the controller (NB dismiss from the *reader*!)
    [reader dismissModalViewControllerAnimated: YES];

    parseHTML = [[NSXMLParser alloc] initWithContentsOfURL:[NSURL URLWithString:[@"http://url.com/suche/?q=" stringByAppendingString:symbol.data]] ];  
    NSLog(@"parser 1 start");
    [parseHTML setDelegate:self];
    [parseHTML parse]; 
    NSLog(@"parser 1 ready");
    [parseHTML release];

}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict
{
    for(NSString *key in [attributeDict allKeys]) {
        if ([[attributeDict valueForKey:key] isEqualToString:@"search-result"]) {
            link_is_here = true;        
        }
        if ([key isEqualToString:@"href"] && link_is_here) {
            product_link = [attributeDict valueForKey:key];
            [parser abortParsing];
            parseHTML2 = [[NSXMLParser alloc] initWithContentsOfURL:[NSURL URLWithString:[@"http://url.com" stringByAppendingString:product_link]]];
            [parseHTML2 setDelegate:self];
            parse_one_ok = true;
            link_is_here = false;
            [parseHTML2 parse];

        }
        if ([key isEqualToString:@"id"] && [[attributeDict valueForKey:key] isEqualToString:@"nutrition-allergy"]) {
            allergy_is_here = true;
        }
        if ([key isEqualToString:@"title"] && allergy_is_here) {      
            NSLog(@"keys:  %@",[attributeDict valueForKey:key]);  
        }
        if ([key isEqualToString:@"id"] && [[attributeDict valueForKey:key] isEqualToString:@"another string"]) {
            allergy_is_here = false;
            parse_one_ok = true;
            NSLog(@"Parser off");
            [parser abortParsing];
        } 
    }
}
-(void) parserDidEndDocument:(NSXMLParser *)parser{
    if (parse_one_ok) {

        [parseHTML2 release];
        parse_one_ok = false;
    }
}

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{

}  

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{

}
- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}


- (void)dealloc {
    [parseHTML release];
    [parseHTML2 release];
    self.product_link = nil;
    self.resultImage = nil;
    self.resultText = nil;
    [super dealloc];
}

@end

Ответы [ 2 ]

1 голос
/ 17 марта 2011

это просто.Вы выпускаете ParseHTML NSXMLPArsetwice.

  1. - (void) imagePickerController: (UIImagePickerController *) читатель didFinishPickingMediaWithInfo: (NSDictionary *) информация в последней строке

    100* - (void) dealloc.

Объект должен быть освобожден, только если вы заработали право собственности.сохраните копию и т. д. Но вы выделили ее только один раз, поэтому ее следует выпустить только один раз.Но вы сделали два выпуска.

Вы также выпускаете объект NSXMLParser parseHTML2 трижды.Согласно вашему коду на любом этапе parseHTML2 будет выпущен как минимум дважды, который сохраняется только один раз.Случай объектов ParseHTML1 был упомянут выше

С уважением, Джексон Санни Родригес

0 голосов
/ 17 марта 2011

Включите NSZombieEnabled. Вы, очевидно, выпускаете то, чем не должны быть. Когда вы сделаете это, он точно покажет вам, где происходит неправильный доступ, и вы сможете проследить, куда вы отпускаете объект. Проверьте этот учебник:

http://www.codza.com/how-to-debug-exc_bad_access-on-iphone

Лучше всего узнать, как это исправить и что не так:)

...