NSMutableArray «EXC_BAD_ACCESS» - PullRequest
       17

NSMutableArray «EXC_BAD_ACCESS»

0 голосов
/ 06 июля 2011

Я часами отлаживал свою программу и получаю сообщение об ошибке EXC_BAD_ACCESS каждый раз, когда запускаю ее.
Я выполнил действия, описанные в этом учебнике , но безрезультатно.

Я постараюсь опубликовать некоторый код и мои результаты, надеясь, что кто-нибудь поможет мне решить мою проблему.

-(void)grabData{
    listOfItems=[[NSMutableArray alloc] init];

    NSString *XMLPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"list.xml"];
    NSData *XMLData   = [NSData dataWithContentsOfFile:XMLPath];
    CXMLDocument *rssParser = [[[CXMLDocument alloc] initWithData:XMLData options:0 error:nil] autorelease];

    NSArray *buttons=[rssParser nodesForXPath:@"//item" error:nil];
    for (CXMLElement *node in buttons) {
        int counter;
        if([[[node attributeForName:@"type"] stringValue] isEqualToString:@"photobutton"]){
            itListCell *itl=[[itListCell alloc] initWithNibName:@"itListCell" bundle:nil];
            itl.rows=0;
            itl.iw=0.0;
            itl.ih=0.0;
            itl.uiid=@"";
            itl.text=@"";
            itl.action=@"";
            itl.aUrl=@"";
            itl.iUrl=@"";
            for(counter = 0; counter < [node childCount]; counter++) {
                if([[[node childAtIndex:counter] name] isEqualToString:@"text"]){
                    NSString * value = [[[node childAtIndex:counter] stringValue] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
                    if ([value length] != 0){
                        itl.text=[[node childAtIndex:counter] stringValue];
                    }
                }
                else{
                    if([[[node childAtIndex:counter] name] isEqualToString:@"uiid"]){
                        itl.uiid=[[node childAtIndex:counter] stringValue];
                    }
                    else{
                        if([[[node childAtIndex:counter] name] isEqualToString:@"rows"]){
                            itl.rows=[[[node childAtIndex:counter] stringValue] intValue];
                        }
                        else{
                            if([[[node childAtIndex:counter] name] isEqualToString:@"icon"]){
                                itl.iUrl=[[node childAtIndex:counter] stringValue];
                                CXMLElement *n=(CXMLElement*)[node childAtIndex:counter];
                                NSString *resString=[[n attributeForName:@"resize"] stringValue];
                                NSArray *resArray= [resString componentsSeparatedByString: @","];
                                itl.iw=[[resArray objectAtIndex:0] floatValue];
                                itl.ih=[[resArray objectAtIndex:1] floatValue];
                            }
                            else{
                                if([[[node childAtIndex:counter] name] isEqualToString:@"action"]){
                                    itl.action=[[((CXMLElement*)[node childAtIndex:counter]) attributeForName:@"name"] stringValue];
                                    NSArray *getaUrl=[node elementsForName:@"action"];
                                    for(CXMLElement *n in getaUrl){
                                        for(int c = 0; c < [n childCount]; c++) {
                                            if([[[n childAtIndex:c] name] isEqualToString:@"url"]){
                                                itl.aUrl=[[n childAtIndex:c] stringValue];
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            [listOfItems addObject:itl];
            [itl release];
        }
    }
}




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

Похоже, что NSMutableArray *listOfItems вызывает проблему.
Если я добавлю сохранение к его распределению в функции grabData, больше ошибок не будет.
Если я удалю [listOfItems release]; из функции dealloc, ошибок больше не будет.
Но самое интересноечто если я удалю последнюю строку функции grabData, которая [itl release];, больше ошибок не будет.

Я застрял и не могу найти решение.Я был бы очень признателен, если кто-то может помочь мне решить эту проблему.

РЕДАКТИРОВАТЬ: по запросу это .h из itListCell

//
//  itListCell.h
//  TemplatesTest
//
//  Created by foobyte on 6/30/11.
//  Copyright 2011 FOO. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "Constants.h"
#import "imageDelegate.h"


@interface itListCell : UIViewController {
    UIImageView *i;
    UILabel *l;

    BOOL imageDidLoad;
    CGFloat width;
    CGFloat maxCalculatedHeight;
    CGSize strSize;

    //properties
    int rows;
    CGFloat iw;
    CGFloat ih;
    NSString *uiid;
    NSString *text;
    NSString *action;
    NSString *aUrl;
    NSString *iUrl;

}

@property (nonatomic, retain) UIImageView *i;
@property (nonatomic, retain) UILabel *l;
@property (nonatomic, retain) NSString *uiid;
@property (nonatomic, retain) NSString *text;
@property (nonatomic, retain) NSString *action;
@property (nonatomic, retain) NSString *aUrl;
@property (nonatomic, retain) NSString *iUrl;
@property (nonatomic) int rows;
@property (nonatomic) CGFloat iw;
@property (nonatomic) CGFloat ih;

-(void)setwidth:(CGFloat)w;
-(CGFloat)getMaxHeight;
-(UIImage *)downloadIcon:(NSString *)s;

@end

и вот функция, котораяиспользует объекты в listOfItems:

-(void) setupPage{
    [scroll setCanCancelContentTouches:NO];
    scroll.indicatorStyle=UIScrollViewIndicatorStyleWhite;
    scroll.clipsToBounds=YES;
    scroll.scrollEnabled=YES;
    scroll.pagingEnabled=NO;
    [scroll setBackgroundColor:[UIColor blackColor]];

    CGFloat y=0.0;
    CGFloat cy=0.0;

    int count=[listOfItems count];
    for(int i=0;i<count;i++){
        [((itListCell *)[listOfItems objectAtIndex:i]) setwidth:self.view.frame.size.width];
        CGFloat h=[((itListCell *)[listOfItems objectAtIndex:i]) getMaxHeight];
        ((itListCell *)[listOfItems objectAtIndex:i]).view.frame=CGRectMake(lITX, y, self.view.frame.size.width-lITM, h);
        [scroll addSubview:((itListCell *)[listOfItems objectAtIndex:i]).view];
        y+=h;
        if(i >= 2)
            cy+=h;
    }
    [scroll setContentSize:CGSizeMake(scroll.frame.size.width, cy+[scroll bounds].size.height)];
}

1 Ответ

1 голос
/ 06 июля 2011

Наилучшим предположением является то, что свойства itListCell не сохраняются и не копируются, а вы переустанавливаете одно из присвоенных ему значений.

...