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
)
イムは本当にここで問題ですか理解いけません。
これは機能します!この問題は '@dynamic'にありました。これはos '@synthesize'の代わりにXcodeによって生成されました。 – AntonPalich
これは非常に危険なことです。 Blindly @ dynamicから@ synthesizeに切り替えると、それらのメソッドがクラスに追加されます。 @ dynamicは、Objective Cが実行時にメッセージを処理することをコンパイラに保証する方法です。このメソッドが存在することは保証されていません。 NSManagedObjectのgetterとsetterの基礎となる実装は、特定のメソッドではなく、setValue:forKey:を使用します。 @dynamicの代わりに@ synthesizeを使用すると、クラッシュが修正される可能性が高くなりますが、CoreDataが破損します。 – paulrehkugler