我有一个非常奇怪的问题,我不知道为什么会发生这种情况。 很简单,我有一个存储NSString和NSURL的类。可以有许多这样的类,所以我将它们存储在一个可变数组中。
此数组用于填充tableview。当用户点击表格单元格时,我从数组中获取其中一个列表类,获取其URL属性,并将其传递给详细视图。这样可以在99%的时间内正常工作,但是我传递的URL属性有时会在1%的时间内被释放。
特别是在调试器中,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;
}
baseURL正以某种方式发布(我认为在TBXML的内容中),这使得父表tableview类的NSURL被释放。
我将showWithData方法更改为以下内容,问题已不复存在。似乎使用'copy'保护原始NSURL不被释放。我不理解它,因为当我在调试器中检查时,传递给方法的NSURl和baseURL var都具有相同的内存地址。有人可以解释一下吗?
-(id) showWithData:(xListData *) data;
{
if ( [super init]) {
self.baseURL=[data.URL copy];
}
答案 0 :(得分:1)
我很惊讶这一切都适用
listData *rld = [listData alloc];
试试这个,你的网址可能会停止消失
listData *rld = [[listData alloc] init];
也不要盖上你的伊娃。它有时混淆了综合指令。
@interface ListData : NSObject {
NSURL *url;
NSString *title;
}
@property(nonatomic,retain) NSURL *url;
@property(nonatomic,copy) NSString *title;
@end
答案 1 :(得分:0)
这根本没有用,但是你可以试试。不要通过rld.URL访问URL变量,而是尝试添加如下内容。
-(NSURL*)returnURLvalue {return URL;}
(当然,在h文件中有适当的声明)
并使用
self.listView = [[ListView alloc] showWithData:[rld returnURLvalue]];
获取变量值。
我强调我不知道这会在你的情况下起作用,但它经常解决我遇到的任何莫名其妙的问题。符号。只是一个想法。
答案 2 :(得分:0)
如果你在listDataArray中存储了很多元素,你可能需要考虑用显式内存分配替换方便构造函数[NSURL URLWithString:...]并随后重新分配。
的内容NSURL* URL = [[NSURL alloc] initWithString:...];
rld.URL = URL;
[URL release];
便捷构造函数返回自动释放的对象,并且在创建许多对象的情况下不鼓励使用自动释放的对象。另请参阅this question的答案。