iphone copyWithZone утечка памяти - нужна помощь - PullRequest
0 голосов
/ 27 марта 2011

Мне трудно понять, что я делаю неправильно, поэтому я надеюсь, что кто-то сможет указать мне правильное направление.Я работаю над приложением, где у вас есть массив объектов.каждый из этих объектов может иметь массив объектов и, следовательно, (для целей навигации) иметь указатель на свой главный объект.когда я пытаюсь сделать копию одного из этих объектов, я испытываю утечку памяти.

@interface ListItem :  NSObject <NSCopying>  {

    ListItem *MasterItem;
    NSString *strText;
    NSMutableArray *listItems;
    BOOL boolDone;
    NSDate *itemDate;

}

@property (nonatomic, retain) ListItem *MasterItem;

@property (nonatomic, retain) NSString *strText;

@property (nonatomic, retain) NSMutableArray *listItems;

@property (nonatomic, retain) NSDate *itemDate;

@property BOOL boolDone;

@end


@implementation ListItem
@synthesize strText, listItems, boolDone, MasterItem, itemDate;

- (id) init
{
    if ( self = [super init] )
    {
        self.strText = nil;

        self.listItems = nil;

        self.itemDate = nil;

        self.boolDone = FALSE;

        self.MasterItem = nil;
    }
    return self;

}


-(id)copyWithZone:(NSZone *)zone
{

    ListItem *another = [[[self class] allocWithZone:zone] init];

    another.MasterItem = [MasterItem copyWithZone:zone];
    another.listItems = [listItems copyWithZone:zone];
    another.strText = [strText copyWithZone:zone];
    another.itemDate = [itemDate copyWithZone:zone];
    another.boolDone = boolDone;
    return another;
}


-(void) dealloc
{
    if (itemDate != nil)
        [itemDate release];

    if (MasterItem != nil)
        [MasterItem release];

    if (strText != nil)
        [strText release];

    if (listItems != nil)
        [listItems release];

    [super dealloc];
}


@end

когда я вызываю это, утечка памяти:

ListItem *itemMasterToSave = [itemMaster copy];
[itemMasterToSave release];

1 Ответ

2 голосов
/ 27 марта 2011

Линия

another.MasterItem = [MasterItem copyWithZone:zone];

должно быть

another.MasterItem = [[MasterItem copyWithZone:zone] autorelease];

и для каждой строки настройки свойства.

Также вы забыли освободить свойство NSDate.

Советы: вам не нужно выполнять проверку на ноль, потому что она позаботилась о времени выполнения цели c.

...