2011-03-23 65 views
1

我有一个非常非常奇怪的问题,我不知道为什么会发生。 简而言之,我有一个存储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]; 
} 
+0

你是如何初始化listDataArray的? – hennes 2011-03-23 15:45:15

+0

你的意思是对象正在被释放?你的访问崩溃了吗?指针是否突然指向空?还是它指向一个包含空值的有效对象? – 2011-03-23 15:45:46

+0

具有空值的有效对象。 – dubbeat 2011-03-23 15:47:06

回答

0

这可能根本没有帮助,但它是你可以尝试的东西。不要通过rld.URL访问URL变量,请尝试添加如下内容。

-(NSURL*)returnURLvalue {return URL;} 

(有当然的.h文件相应的声明)

并使用

self.listView = [[ListView alloc] showWithData:[rld returnURLvalue]]; 

得到的变量值。

我强调我不知道这会适用于您的情况,但它通常可以解决我遇到的任何莫名其妙的问题。符号。只是一个想法。

+0

你能解释一下为什么这会和使用rld.URL相比有什么不同吗? – hennes 2011-03-23 16:15:14

+0

它不应该,但我发现有时它确实如此。我从来没有找到一个好的答案,为什么。不知道它是否会影响这个问题,但它为我解决了类似的问题。 – 2011-03-24 19:43:36

0

如果你真的在listDataArray中存储了很多元素,你可能需要考虑用明确的内存分配替换便利构造函数[NSURL URLWithString:...]并随后释放。沿

NSURL* URL = [[NSURL alloc] initWithString:...]; 
rld.URL = URL; 
[URL release]; 

的便捷构造东西线返回一个自动释放的对象,并使用自动释放的对象在创建许多对象的情况下不鼓励。另请参阅this question的答案。

+0

你能否推测为什么大部分时间我的NSURL很好,只有偶尔它是空的? – dubbeat 2011-03-23 16:41:55

+0

@dubbeat我怀疑它与autoreleases和事实有关,只保留URL(而标题被复制)。在某些时候,autorelease池会溢出,然后必须释放一些东西。 – hennes 2011-03-23 16:55:32

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 
+0

“self.listView = [[ListView alloc] showWithData:rld.URL];”看起来很腥,因为类似的原因。如果showWithData:是一个初始化程序,它应该被命名为initWithData :. – 2011-03-23 17:41:13