Изменяемый массив автоматически изменяется на неизменяемый при добавлении к нему объекта. Зачем? - PullRequest
0 голосов
/ 30 июня 2010

Это сеттеры и геттеры.

-(NSMutableArray*)contactList
{
    return contactList;
}
-(void)setContactList:(NSMutableArray*) aContactList
{
    [contactList release];
    contactList=aContactList; //its working fine but leaks 
    // contactList=[aContactList copy]; 
    //   If I keep like this getting exception as mutating 
    //   object setting to immutable but it is mutable only. 
}

В контроллере представления, в функции редактирования, я добавляю новый объект в список, подобный этому

[tempDetailsObj.contactList addObject:editcontacts];

здесь я получаю исключениекак мутирующий

объект, устанавливаемый в неизменяемый, но только изменяемый.

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

Ответы [ 3 ]

1 голос
/ 30 июня 2010

Вы можете попробовать -mutableCopy или просто использовать уже существующую ссылку с -removeAllObjects:

-(NSMutableArray*)contactList
{
    return contactList;
}
-(void)setContactList:(NSMutableArray*) aContactList
{
    //   Either this way:
    [contactList removeAllObjects];
    [contactList addObjectsFromArray:aContactList];
    //   Or this way:
    [contactList release];
    contactList = [aContactList mutableCopy];
}
1 голос
/ 30 июня 2010

Для начала, вы не вступаете во владение параметрами, переданными вашему установщику.Также вы захотите скопировать изменяемые экземпляры, чтобы избежать их изменения под вами.

Используйте, например, это:

- (void)setContactList:(NSMutableArray *)aContactList {
    NSMutableArray *tmp = contactList;
    contactList = [aContactList mutableCopy];
    [tmp release];
}

Но тогда, почему бы не использовать просто использовать объявленные свойства:

// interface:
@property (nonatomic, copy) NSMutableArray *contactList;

// implementation:
@synthesize contactList;
0 голосов
/ 30 июня 2010

Я не знаю, решит ли это проблему, но попробуйте следующее

вместо

 [contactList release]; contactList=aContactList;

, попробуйте перезапустить старую ссылку

[contactList removeAllObjects]; [contactList addObjectsFromArray:aContactList];

С уважением

...