0

我一直在收到 EXC_BAD_ACCESS,我不知道为什么......

简单的任务:

Parser Class 在名为 listArray 的 NSMutableArray 中使用 touchXML 传递 XML。在 GrabCountry 方法中,我可以访问 listArray 和 listArray.count 效果很好。

现在我需要 MasterViewController 的另一个类中的 listArray.count。但我一直收到 EXC_BAD_ACCESS 错误。请帮忙!

这是代码片段:Parser.h

#import <Foundation/Foundation.h>

@interface Parser : NSObject

@property (strong, retain) NSMutableArray *listArray;
@property (strong, retain) NSURL *url;

-(void) grabCountry:(NSString *)xmlPath;
@end

解析器

#import "Parser.h"
#import "TouchXML.h"

@implementation Parser
@synthesize listArray;
@synthesize url;

-(void) grabCountry:(NSString *)xmlPath {

    // Initialize the List MutableArray that we declared in the header
    listArray = [[NSMutableArray alloc] init];  

    // Convert the supplied URL string into a usable URL object
    url = [NSURL URLWithString: xmlPath];

   //XML stuff deleted

    // Add the blogItem to the global blogEntries Array so that the view can access it.
   [listArray addObject:[xmlItem copy]];

  //works fine
  NSLog(@"Amount: %i",listArray.count);
}

 @end

主视图控制器.h

#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import "TouchXML.h"
#import "Parser.h"

@class Parser;

    @interface MasterViewController : UITableViewController{

    Parser *theParser;

}
@end

MasterViewControlelr.m

- (void)viewDidLoad
{
NSString *xmlPath = @"http://url/to/xml.xml";

theParser = [[Parser alloc] init];
//Starts the parser
[theParser grabCountry:xmlPath];

//Here I want to access the Array count, but getting an BAD ACCESS error
NSLog(@"Amount %@",[theParser.listArray count]);

[super viewDidLoad];
}

谁能解释一下这里的问题是什么?谢谢!

4

1 回答 1

1

在内部,每个@property都有一个对应的实例变量。

在您的-grabCountry方法中,您直接访问语句中的实例变量listArray = [[NSMutableArray alloc] init];(与 相同url = [NSURL URLWithString: xmlPath];),而不是 的@propertysetter 方法,导致NSMutableArrayalloc-init不会被属性保留。要调用@property的 setter 方法,您应该调用

NSMutableArray *temp = [[NSMutableArray alloc] init];
self.listArray = temp; // or [self setListArray:temp];
[temp release];

如果您希望在直接访问 的实例变量时让 Xcode 显示错误@property,可以使用@synthesize listArray = _listArray,它将实例变量的名称更改为_listArray.

通常,如果有alloc-init,则必须有相应的release(除非使用自动引用计数)。


此外,在语句中,不需要[listArray addObject:[xmlItem copy]];调用 to ,因为s 保留添加到它们的每个对象。调用还会增加保留计数,这是另一个泄漏。相反,你应该有copyNSArraycopy[self.listArray addObject:xmlItem];


您得到 EXC_BAD_ACCESS 因为在 中NSLog(@"Amount %@",[theParser.listArray count]);,您使用的是%@格式说明符,它是用于NSStrings 的。你想打印数组的计数,一个整数,所以你应该使用%dor %i

于 2012-04-06T00:12:50.833 回答