我一直得到一个EXC_BAD_ACCESS,我无法弄明白为什么......
简单任务:
Parser类在名为listArray的NSMutableArray中使用touchXML来调用XML。 在方法grabCountry中,我可以访问listArray,listArray.count效果很好。
现在我需要另一个Class中的listArray.count MasterViewController。 但我总是得到一个EXC_BAD_ACCESS错误。 请帮忙!
以下是代码snipplet: Parser.h
#import <Foundation/Foundation.h>
@interface Parser : NSObject
@property (strong, retain) NSMutableArray *listArray;
@property (strong, retain) NSURL *url;
-(void) grabCountry:(NSString *)xmlPath;
@end
Parser.m
#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
MasterViewController.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];
}
有谁能解释一下这里的问题是什么? 谢谢!
答案 0 :(得分:1)
在内部,每个@property
都有一个相应的实例变量。
在-grabCountry
方法中,您直接访问语句listArray = [[NSMutableArray alloc] init];
中的实例变量(与url = [NSURL URLWithString: xmlPath];
相同),而不是@property
的setter方法,导致NSMutableArray
您alloc-init
'未被财产保留。@property
要调用NSMutableArray *temp = [[NSMutableArray alloc] init];
self.listArray = temp; // or [self setListArray:temp];
[temp release];
的setter方法,您应该调用
@property
如果您希望在直接访问@synthesize listArray = _listArray
的实例变量时让Xcode显示错误,您可以拥有_listArray
,这会将实例变量的名称更改为{{1} }。
通常,如果有alloc-init
,则必须有相应的release
(除非使用自动引用计数)。
此外,在[listArray addObject:[xmlItem copy]];
语句中,不需要调用copy
,因为NSArray
会保留添加到它们的每个对象。调用copy
也会增加保留计数,这是另一个泄漏。相反,您应该只有[self.listArray addObject:xmlItem];
您获得了EXC_BAD_ACCESS,因为在NSLog(@"Amount %@",[theParser.listArray count]);
中,您使用的是%@
格式说明符,用于NSString
s。您想要打印数组的计数,即整数,因此您应该使用%d
或%i
。