2012-03-25 22 views
2

我遇到了一些問題,可能對您很簡單。我正在使用核心數據。我有一個實體:Session,它有三個屬性:access_token,user_id和secret。嘗試訪問特定對象屬性時出現無法識別的選擇器錯誤

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 

有一個代碼,其中IM使用該實體:

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

此代碼破例:

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; 

基本上這個管理您的getter和setter。

+0

This Works!問題出在'@dynamic',它是由Xcode生成的,而不是由'@synthesize'生成的。 – AntonPalich 2012-03-25 11:52:02

+2

這是非常危險的錯誤。盲目地從@ dynamic切換到@ synthesize將導致這些方法被添加到類中。 @ dynamic是Objective C向編譯器保證消息將在運行時處理的方式。這種方法不存在的保證; NSManagedObject的getter和setter的底層實現使用setValue:forKey:,而不是一個特定的方法。使用@ synthesize而不是@ dynamic將最有可能解決您的崩潰問題,但它會破壞CoreData。 – paulrehkugler 2013-11-27 03:56:33

相關問題