Во-первых, неизменяемые коллекции Какао являются поточно-ориентированными.Их изменяемые аналоги не поточно-ориентированы.Создание вашего кода потокобезопасным, зависит от дизайна вашего приложения.Хорошая практика в многопоточной программе - использовать как можно больше неизменяемых данных.
Во-вторых, в:
NSMutableDictionary *holderKey = [[NSMutableDictionary alloc]initWithObjectsAndKeys:temprecord,[NSString stringWithFormat:@"%d",[casesListArray count]+1],nil];
[self.casesListArray addObject:holderKey];
[holderKey release];
holderKey =nil;
[temprecord removeAllObjects];
у вас есть следующее:
temprecord
указывает на изменяемый массив - вы создаете изменяемый словарь с именем
holderKey
, который содержит один объект, а именно тот же temprecord
, как указано выше - вы добавляете этот изменяемый словарь в
self.casesListArray
- вы освобождаете
holderKey
, который не освобождается, потому что он был добавлен в массив на предыдущем шаге - вы удаляете все объекты из
temprecord
.Поскольку temprecord
- это тот же массив, что и в holderKey
, в этом словаре также будет пустой массив.Поскольку holderKey
было добавлено к self.casesListArray
, соответствующий элемент массива является тем же словарем с тем же (теперь пустым) массивом.
Поскольку вы отправляете -removeAllObjects
в temprecord
во времяПри выполнении этого метода вы, вероятно, захотите вместо этого сохранить (изменяемую или неизменяемую) копию текущих значений массива:
NSMutableArray *tempRecordCopy = [temprecord mutableCopy];
NSMutableDictionary *holderKey = [[NSMutableDictionary alloc]initWithObjectsAndKeys:tempRecordCopy,[NSString stringWithFormat:@"%d",[casesListArray count]+1],nil];
[tempRecordCopy release];
Я не совсем уверен, нужно ли вам массив должен быть изменяемым.Если вы этого не сделаете, измените это значение на NSArray
и -copy
, и вы получите неизменную копию.
Наконец, вы используете странный шаблон, который приводит к утечкам памяти в настройке управляемой памяти,Например, в:
d1= nil;
[d1 release];
, поскольку вы присваиваете nil
для d1
, следующая инструкция, [d1 release]
, фактически является бездействующей.Это означает, что d1
больше не указывает на исходный объект, и этот объект не был освобожден.Не делай этого.Вместо этого:
[d1 release];
в большинстве случаев достаточно, и, если вам действительно нужно nil
вывести переменную, сделайте это после выпуска:
[d1 release];
d1 = nil;
Редактировать: Еще одно примечание: в:
return temprecord;
[temprecord release];
temprecord
не освобождается, потому что метод заканчивается при возврате.Эта попытка выпустить temprecord
является недостижимым кодом и никогда не выполняется.Вместо этого вы хотите:
return [temprecord autorelease];
Другое редактирование: Обратите внимание, что -setObject:forKey:
- это канонический метод добавления объектов в словарь.Вы используете -setValue:forKey:
, который является методом KVC, который имеет своеобразное поведение при использовании в словарях.Если вы не знакомы с KVC, я предлагаю вам использовать -setObject:forKey:
.