Вот как бы я это написал:
for (NSXMLElement *categoryElement in nodes) {
NSManagedObject *newObject = [catArrayController newObject];
[newObject setValue:[categoryElement stringValue] forKey:@"name"];
[catArrayController addObject:newObject];
[newObject release];
}
Во-первых, я использую Objective-C 2.0 для каждого синтаксиса. Это проще, чем использовать индексные переменные. Я устранил i
и arrayCount
.
Далее я достал твой NSAutoreleasePool
. Ни один из объектов в цикле не освобождается автоматически, поэтому это не имело никакого эффекта. (Метод newObject
возвращает сохраненный объект, который, по соглашению, делают методы со словом new
в их имени). Именно поэтому я выпускаю newObject
после добавления его в контроллер массива. Поскольку я больше не буду использовать его в этом методе, мне нужно выпустить его.
Кроме того, вы определили new
(который я переименовал в newObject
) как NSString
. Базовые объекты данных всегда являются экземпляром NSManagedObject
или подклассом NSManagedObject
.
Ваша строка [categoryEl = [nodes objectAtIndex:i]]
не скомпилируется. Это связано с тем, что синтаксис скобок используется для отправки сообщения объекту. Это оператор присваивания, поэтому синтаксис скобок здесь не нужен. (Эта строка также больше не нужна, потому что я изменил цикл для использования синтаксиса for-each) Но, для дальнейшего использования, categoryEl = [nodes objectAtIndex:i];
сработало бы.