2012-03-25 5 views
2

私は少し問題があります。私はコアデータを使用しています。私はエンティティ:セッションを持っています。セッションには、access_token、user_id、およびsecretという3つの属性があります。特定のオブジェクトプロパティにアクセスしようとしたときにセレクタエラーが認識されない

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:

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]; 

このコードは例外を作る:

#import "Session.h" 

@implementation Session 

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

@end 

このエンティティを使用してイムコードは、あります:

newSession.secret = [JSON objectForKey:@"secret"]; 

MyProject[7678:bc03] -[Session setSecret:]: unrecognized selector sent to instance 0x4e572d0 

これはの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> 

このスタックされたトレース:

*** 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 
) 

イムは本当にここで問題ですか理解いけません。

答えて

2

.hファイルに、このようなプロパティを定義します。

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

そしてあなたの.mファイル内

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

基本的にこれはあなたのゲッターとセッターを管理します。

+0

これは機能します!この問題は '@dynamic'にありました。これはos '@synthesize'の代わりにXcodeによって生成されました。 – AntonPalich

+2

これは非常に危険なことです。 Blindly @ dynamicから@ synthesizeに切り替えると、それらのメソッドがクラスに追加されます。 @ dynamicは、Objective Cが実行時にメッセージを処理することをコンパイラに保証する方法です。このメソッドが存在することは保証されていません。 NSManagedObjectのgetterとsetterの基礎となる実装は、特定のメソッドではなく、setValue:forKey:を使用します。 @dynamicの代わりに@ synthesizeを使用すると、クラッシュが修正される可能性が高くなりますが、CoreDataが破損します。 – paulrehkugler

関連する問題