objective-c初学者:getter setter prob和EXC_BAD_ACCESS错误

时间:2012-04-05 23:48:49

标签: iphone objective-c cocoa-touch getter-setter accessor

我一直得到一个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];
}

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

1 个答案:

答案 0 :(得分:1)

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

-grabCountry方法中,您直接访问语句listArray = [[NSMutableArray alloc] init];中的实例变量(与url = [NSURL URLWithString: xmlPath];相同),而不是@property的setter方法,导致NSMutableArrayalloc-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