我有一个非常非常奇怪的问题,我不知道为什么会发生。 简而言之,我有一个存储NSString和NSURL的类。可以有很多这些类,所以我将它们存储在一个可变数组中。NSURL值意外释放
此数组用于填充tableview。当用户点击表格单元格时,我从数组中获取列表类中的一个,获取其URL属性,并将其传递给详细视图。这可以在99%的时间内正常工作,但其他1%的时间我有时通过的URL属性已经释放。
特别是在调试器中NSURL“无效摘要”及其urlstring财产说“”
我注释掉每当我释放NSURL地方。奇怪的是,同一个类中的NSString变量不会遭受同样的不需要的行为。
// list data
@interface ListData : NSObject {
NSURL *URL;
NSString *Title;
}
@property(nonatomic,retain) NSURL *URL;
@property(nonatomic,copy) NSString *Title;
@end
#import "ListData.h"
@implementation ListData
@synthesize URL;
@synthesize Title;
-(void)dealloc
{
[URL release];
[Title release];
[super dealloc];
}
@end
// table delegate method
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
ListData *rld=nil;
rld=[listDataArray objectAtIndex:indexPath.row];
if (self.listView) {
//[remixView closeRemix];
[self.listView release];
self.listView=nil;
}
// occassionaly the value of rld.URL is being released somehow
self.listView = [[ListView alloc] showWithData:rld.URL ];
self.listView.title = rld.remixTitle;
[table.navigationController pushViewController:listView animated:YES];
}
//population of list array
listArray =[[NSMutableArray alloc]init];
while (listelement!=nil) {
listData *rld = [listData alloc];
[rld setURL:[NSURL URLWithString:[TBXML textForElement:[TBXML childElementNamed:@"url" parentElement:listelement]]]];
[rld setTitle:[TBXML textForElement:[TBXML childElementNamed:@"title" parentElement:listelement]]];
[listArray addObject:rld];
[rld release];
listelement = [TBXML nextSiblingNamed:@"list" searchFromElement:listelement];
}
编辑1
我想我找到了问题,但我真的不知道怎么回事。
在listview showWithData方法中,我传入一个url并将它分配给像这样的nsurl var的listview。
-(id) showWithData:(ListData *) data;
{
if ( [super init]) {
baseURL=data.URL;
}
是基本URL被释放某种方式(在TBXML我想大便),这是从父的tableview类使NSURL被释放。
我将showWithData方法更改为以下,并且问题已不再发生。似乎使用'复制'保护原始NSURL不被释放。我不明白这一点,因为当我在调试器中检查时,传递给方法的NSURl和baseURL var都具有相同的内存地址。有人可以解释这一点吗?
-(id) showWithData:(xListData *) data;
{
if ( [super init]) {
self.baseURL=[data.URL copy];
}
你是如何初始化listDataArray的? – hennes 2011-03-23 15:45:15
你的意思是对象正在被释放?你的访问崩溃了吗?指针是否突然指向空?还是它指向一个包含空值的有效对象? – 2011-03-23 15:45:46
具有空值的有效对象。 – dubbeat 2011-03-23 15:47:06