В вашем коде у вас есть число alloc
с. Они должны быть сбалансированы с release
. У вас также есть copy
, который должен быть сбалансирован с release
. Если вы не отпустите эти объекты, вы будете снова и снова выделять новые объекты, и в конечном итоге вам не хватит памяти.
Что вам нужно сделать, так это выяснить, где в вашем коде находится подходящее место для их выпуска. Когда вам больше не нужны объекты, которые вы выделили, вы должны освободить их. В вашем случае было бы разумно добавить следующий код в ваш метод - (void)parser:didEndElement:namespaceURI:qualifiedName:
, например:
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
if ([elementName isEqualToString:@"table"]) {
// save values to an item, then store that item into the array...
[item setObject:currentEname forKey:@"ename"];
//NSLog(@"%@",item);
[self.dataArray addObject:[[item copy] autorelease]];
NSLog(@"%@",dataArray);
}
[currentEid release];
[currentEname release];
[currentEurl release];
}
Обратите внимание, что я также добавил autorelease
к вашему copy
. copy
полезно, потому что он создает неизменную копию вашего объекта, что в данном конкретном случае может быть тем, что вам нужно. Однако, когда вы создаете копию, вы являетесь ее владельцем и несете ответственность за ее публикацию. Ваш массив dataArray
станет владельцем вашей копии item
, когда вы добавите ее с помощью addObject:
, но вы все равно должны отказаться от своей собственности, выпустив ее. Однако мы не можем release
это сделать до того, как передадим его в массив, в противном случае копия item
будет освобождена до того, как будет передана dataArray
, поэтому вместо этого она автоматически освобождается. Автосвобожденный объект гарантированно выживет, по крайней мере, до конца метода.
Альтернативой автоматическому высвобождению является ручное отслеживание копии item
, например:
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
if ([elementName isEqualToString:@"table"]) {
NSDictionary *itemCopy;
// save values to an item, then store that item into the array...
[item setObject:currentEname forKey:@"ename"];
//NSLog(@"%@",item);
itemCopy = [item copy];
[self.dataArray addObject:itemCopy];
[itemCopy release];
NSLog(@"%@",dataArray);
}
[currentEid release];
[currentEname release];
[currentEurl release];
}