【发布时间】:2011-07-21 10:28:11
【问题描述】:
我有一个非常奇怪的问题,我不知道它为什么会发生。 很简单,我有一个存储 NSString 和 NSURL 的类。这些类可能有很多,所以我将它们存储在一个可变数组中。
此数组用于填充表格视图。当用户点击表格单元格时,我从数组中获取列表类之一,获取其 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 并将其分配给 listview 的 nsurl var,如下所示。
-(id) showWithData:(ListData *) data;
{
if ( [super init]) {
baseURL=data.URL;
}
baseURL 以某种方式被释放(我认为是在 TBXML 的内部),这使得父 tableview 类中的 NSURL 被释放。
我将 showWithData 方法更改为以下,问题已停止出现。似乎使用“复制”保护了原始 NSURL 不被释放。不过我不明白,因为当我签入调试器时,传递给方法的 NSURl 和 baseURL var 都具有相同的内存地址。有人可以解释一下吗?
-(id) showWithData:(xListData *) data;
{
if ( [super init]) {
self.baseURL=[data.URL copy];
}
【问题讨论】:
-
如何初始化listDataArray?
-
你的意思是对象被释放了吗?您是否遇到错误的访问崩溃?指针是否突然指向空?还是指向一个包含空值的有效对象?
-
具有空值的有效对象。
-
@hennes。 listDataArray =[[NSMutableArray alloc]init];
-
@dubbeat 不,我的意思是你如何用数据填充数组? (抱歉没有具体说明。)
标签: iphone objective-c memory-management nsurl