【发布时间】:2011-01-28 23:28:46
【问题描述】:
我的问题与this question 非常相似,但有一些不同。
我有一个类以 NSString 的形式接收 XML int,解析出一些对象并以 NSArray 的形式返回它们,有点像这样:
//Parser.m
+(NSArray *)parseMessagesFromXml:(NSString *)xml
{
NSMutableArray *messages = [[NSMutableArray alloc] init];
//do some work parsing the xml
//for each <row>
// Message *m = makeMessageFromRow(row);
return [messages autorelease];
}
然后在我的视图控制器类中声明一个 NSArray:
//MyViewController.h
NSArray *messages;
@property (nonatomic, retain) NSArray *messages;
并使用上述方法进行赋值:
//MyViewController.m
messages = [Parser parseMessageFromXml:xml];
[[self tableView] reloadData];
所以问题来了:当我将数组分配给messages 时,其中有元素,但它们都“超出范围”。我已经调试了这个问题,我知道解析方法正确地创建了对象并将它们添加到NSMutableArray,然后再返回它。当我尝试访问messages 中的对象时,我的应用程序崩溃并且调试器显示EXC_BAD_ACCESS。更奇特的是:如果我将数组存储到局部变量中,它就可以正常工作:
NSArray *temp = [Parser parseMessageFromXml:xml];
//temp has all the right objects and they are in scope
messages = temp;
//messages has the objects, but cannot access them (they are out of scope).
好像我可以在本地范围内合法地查看它们,但我不能将它们分配给成员变量。我什至尝试遍历返回的数组,将每个数组分别添加到messages,但结果是一样的:它们超出了范围。我对此一无所知。
messages 作为一个不允许它保存这些对象的成员变量是什么?
【问题讨论】:
标签: objective-c memory-management scope nsarray exc-bad-access