Теперь, когда Xcode4 является общедоступным, я перехожу из этого вопроса из секретного форума Apple:
Может кто-нибудь объяснить, почему код, сгенерированный в следующей процедуре, отличается от кода Xcode3? Является ли код лучше или это может быть ошибкой?
Я использую настраиваемые управляемые классы Core Data, и это была процедура, которую я выполнил в Xcode3:
- Перейти к редактору моделей
- Выберите объект, который вы хотите создать исходный код для
- Перейдите в меню Файл- > Создать- > Новые файлы
- Выберите класс managedobject (или что бы это ни было, я больше не могу открыть xcode3 для проверки)
- Выберите объекты, которые вы хотите сгенерировать (ранее выбранный объект на шаге 2 был отключен)
- Нажмите "Готово"
Теперь, в Xcode4, я ДУМАЮ, вот как это сделать, но я не уверен, потому что он генерирует другой код:
- Перейти к редактору моделей
- Выбрать объект
- Перейдите в меню Файл- > Новый- > Новый файл
- Выберите "Подкласс NSManagedObject"
- Выберите местоположение и создайте.
Код, который он генерирует, отличается по ряду причин:
- Сгенерированный код для добавления и удаления членов набора в сущности больше не объявляется в @interface, а вместо @implementation. Это приводит к тому, что код не может обнаружить эти методы.
- Тот же сгенерированный код для добавления и удаления объектов теперь полностью определен, больше не автогенерируется с использованием CoreDataGeneratedAccessors
Например, Xcode3 сгенерировал бы этот код в файле HEADER:
@interface SampleEntity (CoreDataGeneratedAccessors)
- (void)addChildObject:(Child *)value;
- (void)removeChildObject:(Child *)value;
- (void)addChild:(NSSet *)value;
- (void)removeChild:(NSSet *)value;
@end
Теперь Xcode4 генерирует этот код в файле IMPLEMENTATION:
@implementation SampleEntity
@dynamic children;
- (void)addChildObject:(Child *)value {
NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1];
[self willChangeValueForKey:@"children" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
[[self primitiveValueForKey:@"children"] addObject:value];
[self didChangeValueForKey:@"children" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
[changedObjects release];
}
Может кто-то верить, почему это другое? Кодировка кода Xcode4 не нравится новому способу создания подклассов NSManagedObject.