NSURL值意外释放

时间:2011-03-23 15:38:42

标签: iphone objective-c memory-management nsurl

我有一个非常奇怪的问题,我不知道为什么会发生这种情况。 很简单,我有一个存储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];
}

3 个答案:

答案 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的答案。