2013-11-25 2 views
0

Когда в Xcode 5 я использую код ниже, который находится в области @interface, чтобы получить данные из моей модели CoreData. Он говорит мне, что мне следует вставить полуколоду здесь,NSManagedObjectContext дает ошибку с запросом «;» и я не уверен, почему

- (NSManagedObjectContext *)managedObjectContext; 

Любая помощь приветствуется!

Ниже представлен мой полный блок кода.

//Get Data  
- (NSManagedObjectContext *)managedObjectContext{ 
     NSManagedObjectContext *context = nil; 
     id delegate = [[UIApplication sharedApplication] delegate]; 
     if ([delegate performSelector:@selector(managedObjectContext)]) { 
      context = [delegate managedObjectContext]; 
     } 
     return context; 
    } 
+0

В чем смысл 'if ([delegate performSelector: @selector (managedObjectContext)])'? Если он ответит на селектор, он вернет moc, если он не сработает. – Abizern

+0

@Abizern: Нет, он вернет ноль. Это не означает крушение. Многие API-интерфейсы в obj-c возвращают nil, если что-то не существует. Это довольно часто. – cjwirth

+2

@cjwirth Действительно? Я думаю, вы обнаружите, что это вызывает исключение, если объект не отвечает на сообщение. Вместо этого OP должен вызывать 'responsesToSelector:', который часто выполняется перед отправкой сообщения объекту, который может не отвечать на сообщение по этой точной причине. – Abizern

ответ

2

Когда в Xcode 5 Я использую следующий код, который находится в районе @interface, для получения данных из моей модели CoreData.

Это проблема, вы должны только декларации на @interface. Фактические реализации приводятся в разделе @implementation.

Ваш интерфейс идет

@interface 
- (NSManagedObjectContext *)managedObjectContext; 
@end 

В вас реализации вы кладете фактический метод:

 
@implementation 
... 
//Get Data  
- (NSManagedObjectContext *)managedObjectContext{ 
     NSManagedObjectContext *context = nil; 
     id delegate = [[UIApplication sharedApplication] delegate]; 
     if ([delegate respondsToSelector:@selector(managedObjectContext)]) { 
      context = [delegate managedObjectContext]; 
     } 
     return context; 
    } 
... 
@end 

UPDATE:

Благодаря Abizern для заметив, что была еще одна ошибка в вашем код: строка [delegate performSelector:@selector(managedObjectContext)] должна быть действительно [delegate respondsToSelector:@selector(managedObjectContext)], так как в противном случае приложение произойдет сбой, если он не ответьте на селектор.

0

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

- (NSManagedObjectContext *)managedObjectContext { 

    if (_managedObjectContext != nil) 
    { 
     return _managedObjectContext; 
    } 

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
    if (coordinator != nil) 
    { 
     _managedObjectContext = [[NSManagedObjectContext alloc] init]; 
     [_managedObjectContext setPersistentStoreCoordinator:coordinator]; 
    } 
    return _managedObjectContext; 
} 
Смежные вопросы