Проблема утечки памяти - PullRequest
0 голосов
/ 02 мая 2011

В моем классе Orders у меня есть 2 функции: generateOrderSummary и createOrderSummaryItem:

- (OrderSummary *)generateOrderSummary {


//Cleaning the references but OrderSummaryItem leaks
[self.currentOrderSummary removeAllOrderedItems];
self.currentOrderSummary = nil;

for(MenuItem *menuItem in self.selectedItems) {

    OrderSummaryItem *orderSummaryItem = [self createOrderSummaryItem:menuItem];
    //Retain count = 1

    [orderSummary addOrderedItem:orderSummaryItem withServiceStationCode:menuItem.serviceStationCode withCategory:menuItem.category withCourseOrder:menuItem.courseOrder];
   //Retain count = 5;
}

self.currentOrderSummary = orderSummary;
[orderSummary release];
orderSummary = nil;

return self.currentOrderSummary;    
}

- (OrderSummaryItem *) createOrderSummaryItem:(MenuItem *)menuItem {

OrderSummaryItem *summaryItem = [[[OrderSummaryItem alloc]init] autorelease];

//Set summaryItem properties    

return summaryItem;
}

Этот класс OrderSummary содержит 3 NSMutableDictionaries и 1 NSMutableArray, все хранящие ссылку на объект OrderSummaryItem.

-(void)addOrderedItem:(OrderSummaryItem *)orderedItem withServiceStationCode:(NSString *)serviceStationCode withCategory:(NSString *)category withCourseOrder:(NSString *)courseOrder {

if (self.serviceStationDict == nil) {
    self.serviceStationDict = [NSMutableDictionary dictionaryWithCapacity:1];
}
if (self.categoryDict == nil) {
    self.categoryDict = [NSMutableDictionary dictionaryWithCapacity:1];
}
if (self.courseOrderDict == nil) {
    self.courseOrderDict = [NSMutableDictionary dictionaryWithCapacity:1];
}
if(self.orderedItems == nil) {
    self.orderedItems = [NSMutableArray arrayWithCapacity:1];
}

if(serviceStationCode != nil) {
    NSMutableArray *orderedItemsForServiceStation = [self.serviceStationDict objectForKey:serviceStationCode];
    if (orderedItemsForServiceStation != nil) {
        [orderedItemsForServiceStation addObject:orderedItem];
    }
    else {
        orderedItemsForServiceStation = [NSMutableArray arrayWithCapacity:1];
        [orderedItemsForServiceStation addObject:orderedItem];
        [self.serviceStationDict setObject:orderedItemsForServiceStation forKey:serviceStationCode];
       //Retain count = 2
    }
}

if(category != nil) {
    NSMutableArray *orderedItemsForCategory = [self.categoryDict objectForKey:category];
    if (orderedItemsForCategory != nil) {
        [orderedItemsForCategory addObject:orderedItem];
    }
    else {
        orderedItemsForCategory = [NSMutableArray arrayWithCapacity:1];
        [orderedItemsForCategory addObject:orderedItem];
        [self.categoryDict setObject:orderedItemsForCategory forKey:category];
        //Retain count = 3
    }
}

if(courseOrder != nil) {
    NSMutableArray *orderedItemsForCourseOrder = [self.courseOrderDict objectForKey:courseOrder];
    if (orderedItemsForCourseOrder != nil) {
        [orderedItemsForCourseOrder addObject:orderedItem];
    }
    else {
        orderedItemsForCourseOrder = [NSMutableArray arrayWithCapacity:1];
        [orderedItemsForCourseOrder addObject:orderedItem];
        [self.courseOrderDict setObject:orderedItemsForCourseOrder forKey:courseOrder];   
       //Retain count = 4
    }
}
[self.orderedItems addObject:orderedItem];  
      //Retain count = 5
}

-(void)removeAllOrderedItems{

[self.serviceStationDict removeAllObjects];
self.serviceStationDict = nil;
[self.categoryDict removeAllObjects];
self.categoryDict = nil;
[self.courseOrderDict removeAllObjects];
self.courseOrderDict = nil;
[self.orderedItems removeAllObjects];
self.orderedItems = nil;
}

Я не могу выяснить, почему мой OrderSummaryItem протекает, несмотря на его очистку. Моя функция «generateOrderSummary» вызывается каждые 5 секунд для обновления представления.

Ответы [ 2 ]

1 голос
/ 02 мая 2011

если вы объявляете свой массив s getter and setter than after alloc it so u have to Release **twice** because it счетчик хранения становится равным 2, что попробуйте это ...

Head First Iphone Development в этой книге это объясняетхорошо ...

0 голосов
/ 04 мая 2011

попробуйте добавить пул авто-релиза здесь:

for(MenuItem *menuItem in self.selectedItems) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
OrderSummaryItem *orderSummaryItem = [self createOrderSummaryItem:menuItem];
//Retain count = 1

[orderSummary addOrderedItem:orderSummaryItem withServiceStationCode:menuItem.serviceStationCode withCategory:menuItem.category withCourseOrder:menuItem.courseOrder];
//Retain count = 5;
[pool release];}

Возможно, утечки нет, просто основной пул не истощает достаточно часто

...