2012-03-25 2 views
2

Ich habe ein kleines Problem, wahrscheinlich leicht für Sie. Ich verwende Core Data. Ich habe eine Entität: Session, die drei Attribute haben: access_token, user_id und secret.Unbekannter Selektorfehler beim Versuch, auf eine bestimmte Objekteigenschaft zuzugreifen

Session.h:

#import <Foundation/Foundation.h> 
#import <CoreData/CoreData.h> 

@interface Session : NSManagedObject 

@property (nonatomic) NSString * access_token; 
@property (nonatomic) NSNumber * user_id; 
@property (nonatomic) NSString * secret; 

@end 

Session.m:

#import "Session.h" 

@implementation Session 

@dynamic access_token; 
@dynamic user_id; 
@dynamic secret; 

@end 

Es ist ein Code, wo im mit dieser Einheit:

AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { 
    Session *newSession = [NSEntityDescription insertNewObjectForEntityForName:@"Session" inManagedObjectContext:managedObjectContext]; 
    if (newSession != nil) { 
     NSLog(@"access_token: %@", [JSON objectForKey:@"access_token"]); 
     NSLog(@"user_id: %@", [JSON objectForKey:@"user_id"]); 
     NSLog(@"secret: %@", [JSON objectForKey:@"secret"]); 
     newSession.access_token = [JSON objectForKey:@"access_token"]; 
     newSession.user_id = [JSON objectForKey:@"user_id"]; 
     newSession.secret = [JSON objectForKey:@"secret"]; 
    } 
    NSError *savingError = nil; 
    if ([managedObjectContext save:&savingError] == YES) { 
     NSLog(@"Session saved"); 
    } else { 
     NSLog(@"Session not saved"); 
    } 
} failure:nil]; 

Dieser Code eine Ausnahme machen :

Dies ist NSLog:

2012-03-25 15:17:33.987 MyProject[7730:bc03] access_token: <some_access_token> 
2012-03-25 15:17:33.988 MyPriject[7730:bc03] user_id: <some_user_id> 
2012-03-25 15:17:33.989 MyProject[7730:bc03] secret: <some_secret> 

Dies wird Stack-Trace:

*** Call stack at first throw: 
(
0 CoreFoundation      0x010625a9 __exceptionPreprocess + 185 
1 libobjc.A.dylib      0x013e6313 objc_exception_throw + 44 
2 CoreFoundation      0x010640bb -[NSObject(NSObject) doesNotRecognizeSelector:] + 187 
3 CoreFoundation      0x00fd3966 ___forwarding___ + 966 
4 CoreFoundation      0x00fd3522 _CF_forwarding_prep_0 + 50 
5 MyProject       0x00004c94 __42-[APIWrapper authWithLogin:andPassword:]_block_invoke_0 + 836 
6 MyProject       0x0000d452 __74+[AFJSONRequestOperation JSONRequestOperationWithRequest:success:failure:]_block_invoke_0 + 146 
7 MyProject       0x0000e229 __block_global_3 + 41 
8 libdispatch_sim.dylib    0x014de289 _dispatch_call_block_and_release + 16 
9 libdispatch_sim.dylib    0x014e1833 _dispatch_main_queue_callback_4CF + 312 
10 CoreFoundation      0x00fa1589 __CFRunLoopRun + 2521 
11 CoreFoundation      0x00fa0840 CFRunLoopRunSpecific + 208 
12 CoreFoundation      0x00fa0761 CFRunLoopRunInMode + 97 
13 GraphicsServices     0x0153a1c4 GSEventRunModal + 217 
14 GraphicsServices     0x0153a289 GSEventRun + 115 
15 UIKit        0x000ebc93 UIApplicationMain + 1160 
16 MyProject       0x0001b305 main + 181 
17 MyProject       0x000020d5 start + 53 
) 

Im wirklich nicht verstehen, was ist hier Problem.

Antwort

2

In Ihrer .h-Datei definieren Sie Ihre Eigenschaften wie folgt.

@property (nonatomic,retain) NSString * access_token; 
@property (nonatomic,retain) NSNumber * user_id; 
@property (nonatomic,retain) NSString * secret; 

Und dann in .m Datei

@synthesize access_token; 
@synthesize user_id; 
@synthesize secret; 

Grundsätzlich ist dieser verwaltet Ihre Getter und Setter.

+0

Das funktioniert! Das Problem war in '@dynamic', das von Xcode anstelle von '@synthesize' generiert wurde. – AntonPalich

+2

Das ist sehr gefährlich falsch. Wenn Sie blind von @ dynamic auf @ synthesize wechseln, werden diese Methoden zur Klasse hinzugefügt. @ dynamic ist die Methode von Objective C, dem Compiler zu garantieren, dass die Nachricht zur Laufzeit bearbeitet wird. Es ist keine Garantie, dass die Methode existiert. Die zugrunde liegende Implementierung für Getter und Setter von NSManagedObject verwendet setValue: forKey :, keine bestimmte Methode. Die Verwendung von @ synthesize anstelle von @ dynamic wird höchstwahrscheinlich Ihre Abstürze beheben, aber CoreData wird dadurch beschädigt. – paulrehkugler