У меня очень-очень странная проблема, и я понятия не имею, почему это происходит. Достаточно просто у меня есть класс, в котором хранятся 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-адрес и назначал его переменной nsurl для listview, как это.
-(id) showWithData:(ListData *) data;
{
if ( [super init]) {
baseURL=data.URL;
}
baseURL каким-то образом выпускался (я думаю, в недрах TBXML), и это заставляло выпускать NSURL из родительского класса tableview.
Я изменил метод showWithData на следующий, и проблема исчезла. Похоже, что использование «копирования» защищает исходный NSURL от выпуска. Я этого не понимаю, потому что, когда я проверяю отладчик, как NSURl, передаваемый методу, так и baseURL var имеют один и тот же адрес памяти. Кто-нибудь может это объяснить?
-(id) showWithData:(xListData *) data;
{
if ( [super init]) {
self.baseURL=[data.URL copy];
}