Почему автоматически созданный подкласс NSManagedObject не имеет заголовка «Правильный»? - PullRequest
6 голосов
/ 16 мая 2011

Если я создал подклассы NSManagedObject Subclass, я вижу эти функции в файлах реализации Business.m (например)

Ни одна из этих функций не объявлена ​​в файле заголовка Business.h.Я должен лично добавить

- (void)addDistrictsObject:(District *)value;
- (void)addCategoriesObject:(Category *)value;
- (void)addReviewsObject:(Review *)value;

Интересно, почему я должен добавить эти декларации вручную?Почему не автоматически, когда я пытался сгенерировать подкласс?

Кстати, вот эта функция:

- (void)addPromotionsObject:(Promotion *)value {    
    NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1];
    [self willChangeValueForKey:@"Promotions" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
    [[self primitiveValueForKey:@"Promotions"] addObject:value];
    [self didChangeValueForKey:@"Promotions" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
    [changedObjects release];
}

- (void)removePromotionsObject:(Promotion *)value {
    NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1];
    [self willChangeValueForKey:@"Promotions" withSetMutation:NSKeyValueMinusSetMutation usingObjects:changedObjects];
    [[self primitiveValueForKey:@"Promotions"] removeObject:value];
    [self didChangeValueForKey:@"Promotions" withSetMutation:NSKeyValueMinusSetMutation usingObjects:changedObjects];
    [changedObjects release];
}

- (void)addPromotions:(NSSet *)value {    
    [self willChangeValueForKey:@"Promotions" withSetMutation:NSKeyValueUnionSetMutation usingObjects:value];
    [[self primitiveValueForKey:@"Promotions"] unionSet:value];
    [self didChangeValueForKey:@"Promotions" withSetMutation:NSKeyValueUnionSetMutation usingObjects:value];
}

- (void)removePromotions:(NSSet *)value {
    [self willChangeValueForKey:@"Promotions" withSetMutation:NSKeyValueMinusSetMutation usingObjects:value];
    [[self primitiveValueForKey:@"Promotions"] minusSet:value];
    [self didChangeValueForKey:@"Promotions" withSetMutation:NSKeyValueMinusSetMutation usingObjects:value];
}



- (void)addCategoriesObject:(Category *)value {    
    NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1];
    [self willChangeValueForKey:@"Categories" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
    [[self primitiveValueForKey:@"Categories"] addObject:value];
    [self didChangeValueForKey:@"Categories" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
    [changedObjects release];
}

- (void)removeCategoriesObject:(Category *)value {
    NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1];
    [self willChangeValueForKey:@"Categories" withSetMutation:NSKeyValueMinusSetMutation usingObjects:changedObjects];
    [[self primitiveValueForKey:@"Categories"] removeObject:value];
    [self didChangeValueForKey:@"Categories" withSetMutation:NSKeyValueMinusSetMutation usingObjects:changedObjects];
    [changedObjects release];
}

- (void)addCategories:(NSSet *)value {    
    [self willChangeValueForKey:@"Categories" withSetMutation:NSKeyValueUnionSetMutation usingObjects:value];
    [[self primitiveValueForKey:@"Categories"] unionSet:value];
    [self didChangeValueForKey:@"Categories" withSetMutation:NSKeyValueUnionSetMutation usingObjects:value];
}

- (void)removeCategories:(NSSet *)value {
    [self willChangeValueForKey:@"Categories" withSetMutation:NSKeyValueMinusSetMutation usingObjects:value];
    [[self primitiveValueForKey:@"Categories"] minusSet:value];
    [self didChangeValueForKey:@"Categories" withSetMutation:NSKeyValueMinusSetMutation usingObjects:value];
}



- (void)addImagesObject:(Image *)value {    
    NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1];
    [self willChangeValueForKey:@"Images" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
    [[self primitiveValueForKey:@"Images"] addObject:value];
    [self didChangeValueForKey:@"Images" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
    [changedObjects release];
}

- (void)removeImagesObject:(Image *)value {
    NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1];
    [self willChangeValueForKey:@"Images" withSetMutation:NSKeyValueMinusSetMutation usingObjects:changedObjects];
    [[self primitiveValueForKey:@"Images"] removeObject:value];
    [self didChangeValueForKey:@"Images" withSetMutation:NSKeyValueMinusSetMutation usingObjects:changedObjects];
    [changedObjects release];
}

- (void)addImages:(NSSet *)value {    
    [self willChangeValueForKey:@"Images" withSetMutation:NSKeyValueUnionSetMutation usingObjects:value];
    [[self primitiveValueForKey:@"Images"] unionSet:value];
    [self didChangeValueForKey:@"Images" withSetMutation:NSKeyValueUnionSetMutation usingObjects:value];
}

- (void)removeImages:(NSSet *)value {
    [self willChangeValueForKey:@"Images" withSetMutation:NSKeyValueMinusSetMutation usingObjects:value];
    [[self primitiveValueForKey:@"Images"] minusSet:value];
    [self didChangeValueForKey:@"Images" withSetMutation:NSKeyValueMinusSetMutation usingObjects:value];
}



- (void)addReviewsObject:(Review *)value {    
    NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1];
    [self willChangeValueForKey:@"Reviews" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
    [[self primitiveValueForKey:@"Reviews"] addObject:value];
    [self didChangeValueForKey:@"Reviews" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
    [changedObjects release];
}

- (void)removeReviewsObject:(Review *)value {
    NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1];
    [self willChangeValueForKey:@"Reviews" withSetMutation:NSKeyValueMinusSetMutation usingObjects:changedObjects];
    [[self primitiveValueForKey:@"Reviews"] removeObject:value];
    [self didChangeValueForKey:@"Reviews" withSetMutation:NSKeyValueMinusSetMutation usingObjects:changedObjects];
    [changedObjects release];
}

- (void)addReviews:(NSSet *)value {    
    [self willChangeValueForKey:@"Reviews" withSetMutation:NSKeyValueUnionSetMutation usingObjects:value];
    [[self primitiveValueForKey:@"Reviews"] unionSet:value];
    [self didChangeValueForKey:@"Reviews" withSetMutation:NSKeyValueUnionSetMutation usingObjects:value];
}

- (void)removeReviews:(NSSet *)value {
    [self willChangeValueForKey:@"Reviews" withSetMutation:NSKeyValueMinusSetMutation usingObjects:value];
    [[self primitiveValueForKey:@"Reviews"] minusSet:value];
    [self didChangeValueForKey:@"Reviews" withSetMutation:NSKeyValueMinusSetMutation usingObjects:value];
}


- (void)addURLsObject:(URL *)value {    
    NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1];
    [self willChangeValueForKey:@"URLs" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
    [[self primitiveValueForKey:@"URLs"] addObject:value];
    [self didChangeValueForKey:@"URLs" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
    [changedObjects release];
}

- (void)removeURLsObject:(URL *)value {
    NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1];
    [self willChangeValueForKey:@"URLs" withSetMutation:NSKeyValueMinusSetMutation usingObjects:changedObjects];
    [[self primitiveValueForKey:@"URLs"] removeObject:value];
    [self didChangeValueForKey:@"URLs" withSetMutation:NSKeyValueMinusSetMutation usingObjects:changedObjects];
    [changedObjects release];
}

- (void)addURLs:(NSSet *)value {    
    [self willChangeValueForKey:@"URLs" withSetMutation:NSKeyValueUnionSetMutation usingObjects:value];
    [[self primitiveValueForKey:@"URLs"] unionSet:value];
    [self didChangeValueForKey:@"URLs" withSetMutation:NSKeyValueUnionSetMutation usingObjects:value];
}

- (void)removeURLs:(NSSet *)value {
    [self willChangeValueForKey:@"URLs" withSetMutation:NSKeyValueMinusSetMutation usingObjects:value];
    [[self primitiveValueForKey:@"URLs"] minusSet:value];
    [self didChangeValueForKey:@"URLs" withSetMutation:NSKeyValueMinusSetMutation usingObjects:value];
}



- (void)addDistrictsObject:(District *)value {    
    NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1];
    [self willChangeValueForKey:@"Districts" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
    [[self primitiveValueForKey:@"Districts"] addObject:value];
    [self didChangeValueForKey:@"Districts" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
    [changedObjects release];
}

- (void)removeDistrictsObject:(District *)value {
    NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1];
    [self willChangeValueForKey:@"Districts" withSetMutation:NSKeyValueMinusSetMutation usingObjects:changedObjects];
    [[self primitiveValueForKey:@"Districts"] removeObject:value];
    [self didChangeValueForKey:@"Districts" withSetMutation:NSKeyValueMinusSetMutation usingObjects:changedObjects];
    [changedObjects release];
}

- (void)addDistricts:(NSSet *)value {    
    [self willChangeValueForKey:@"Districts" withSetMutation:NSKeyValueUnionSetMutation usingObjects:value];
    [[self primitiveValueForKey:@"Districts"] unionSet:value];
    [self didChangeValueForKey:@"Districts" withSetMutation:NSKeyValueUnionSetMutation usingObjects:value];
}

- (void)removeDistricts:(NSSet *)value {
    [self willChangeValueForKey:@"Districts" withSetMutation:NSKeyValueMinusSetMutation usingObjects:value];
    [[self primitiveValueForKey:@"Districts"] minusSet:value];
    [self didChangeValueForKey:@"Districts" withSetMutation:NSKeyValueMinusSetMutation usingObjects:value];
}

Ответы [ 2 ]

7 голосов
/ 26 июля 2011

До Xcode 4.x автоматически сгенерированный код создавал определение заголовка для методов. Потеря заголовков, вероятно, является еще одной жертвой неконтролируемого контроля качества X4.

Заголовки действительно нужны только для intellisense или другого инструмента интерфейса пользователя. Команда препроцессора @dynamic сообщит компилятору, что методы существуют на основе соглашений об именах. Во время выполнения Core Data проверит класс, отправив respondsToSelector экземплярам объекта или будет использовать методы прямого значения ключа.

Вы всегда можете добавить их самостоятельно с помощью небольшого скрипта, который запускается вручную или со сборкой. Это больно, но, очевидно, дизайн X4 был ориентирован на управление крупными проектами, состоящими из нескольких продуктов, и они отказались от некоторых более старых базовых вещей.

0 голосов
/ 29 мая 2011

Интерфейсные методы нужны только для статической проверки типов и используются только во время компиляции, если вызовы методов создаются динамически во время выполнения, то объявления метода интерфейса ничего не делают.

...