Основной приемник данных в выражении сообщения является неинициализированным значением

#objective-c #ios #core-data

#objective-c #iOS #core-data

Вопрос:

Как мне инициализировать значения IVAR с помощью core data? Анализатор выдает ошибку «Получатель в выражении сообщения является неинициализированным значением»

Вот мой фрагмент кода для вызова объекта, который вызывает проблему в анализаторе :

 CDCamera *camForAnnotation;

for(CDCamera *cams in fetchedObjects){  

    NSSet *annotSet = cams.annotation;

    for (CDAnnotations *myannos in annotSet){           

        if (annotationIdentifer == [myannos objectID]) {
            // found camera for annotation
            camForAnnotation = cams;
            bearing = myannos.bearing;
            break;
        }

    }               

}
double aov =  [camForAnnotation.aov doubleValue] //Receiver in message expression is an uninitialized value
 

Вот моя CDCamera .h:

 #import <CoreData/CoreData.h>

@class CDAnnotations;

@interface CDCamera :  NSManagedObject  
{
}
@property (nonatomic, retain) NSString * notes;
@property (nonatomic, retain) NSNumber * lfl;
@property (nonatomic, retain) NSNumber * ccd_h;
@property (nonatomic, retain) NSNumber * aov;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSNumber * monitor_d_size;
@property (nonatomic, retain) NSSet* annotation;

@end


@interface CDCamera (CoreDataGeneratedAccessors)
- (void)addAnnotationObject:(CDAnnotations *)value;
- (void)removeAnnotationObject:(CDAnnotations *)value;
- (void)addAnnotation:(NSSet *)value;
- (void)removeAnnotation:(NSSet *)value;
- (NSManagedObjectID *) getNSManagedObjectID;
@end
 

Вот мой .m

 #import "CDCamera.h"
#import "CDAnnotations.h"

@implementation CDCamera 

@dynamic notes;
@dynamic lfl;
@dynamic ccd_h;
@dynamic aov;
@dynamic name;
@dynamic monitor_d_size;
@dynamic annotation;

- (NSManagedObjectID *) getNSManagedObjectID{

    return [self objectID];

}

@end
 

Спасибо за вашу помощь.

Ответ №1:

Вы не гарантированно получите значение в camForAnnotation, если внутри вашего цикла for ничего не совпадает.

Вы должны инициализировать значение nil при его объявлении и, возможно, обернуть свой последующий код в оператор if, чтобы сохранить выполнение чего-либо, если camForAnnotation по-прежнему равен нулю.

Ответ №2:

Фил,

Основные данные имеют методы, которые вызываются при извлечении объекта. Они используются для пользовательской инициализации. -awakeFromFetch , -awakeFromInsert и -awakeFromSnapshotEvents: это методы, которые вы должны изучить.

Эндрю