

Xcode Version 8.1(8B62) DeploymentTarget iOS 8.4  
Core Dataにデータを追加する処理を作っております。  
Xcodeの機能でサブクラスを自動生成して自作メソッドを追加しました。

[![Xcodeで作成したデータモデル](https://i.stack.imgur.com/lU2ly.png)](https://i.stack.imgur.com/lU2ly.png)

[code]

    // Media+CoreDataClass.h
    @interface Media : NSManagedObject
        -(void)import:(NSArray *)received;
    @end
    
    @property (nullable, nonatomic, copy) NSString *id;
    @property (nonatomic) int16_t diskNo;
    @property (nullable, nonatomic, copy) NSString *title;
    
    // Media+CoreDataClass.m
    -(void)import:(NSArray *)received {
    
        self.id = [received valueForKey:@"id"];
        self.diskNo = [(NSNumber *)[received valueForKey:@"diskNo"] intValue];
        self.title = [received valueForKey:@"title"];
    }
    
[/code]

以下は正常に終了するのですが、

[code]

    appDelegate_ = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    context_ = appDelegate_.persistentContainer.viewContext;
    Media *media = [NSEntityDescription insertNewObjectForEntityForName:@"Media"
                                                 inManagedObjectContext:context_];
    media.id = [json valueForKey:@"id"];
    media.diskNo = [(NSNumber *)[json valueForKey:@"diskNo"] intValue];
    media.title = [json valueForKey:@"title"];
    [appDelegate_ saveContext];
    
[/code]

以下のようにメソッド呼び出しをするとエラーとなります。

[code]

    appDelegate_ = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    context_ = appDelegate_.persistentContainer.viewContext;
    Media *media = [NSEntityDescription insertNewObjectForEntityForName:@"Media"
                                                 inManagedObjectContext:context_];
    [media import:json];
    [appDelegate_ saveContext];
    
[/code]

> -[Media import:]: unrecognized selector sent to instance 0x6000002c2370  
>  Terminating app due to uncaught exception 'NSInvalidArgumentException',
> reason: '-[Media import:]: unrecognized selector sent to instance
> 0x6000002c2370'

NSManagedObjectのサブクラスに自作メソッドの追加はできると様々なサイトに書かれていたのですが、やり方がまずい点があればご指摘お願い致します。


CC BY-SA 3.0
2017-08-31T21:08:08.230
37649
2017-09-01T17:09:35.873
2017-08-31T22:49:36.543
25139
25139
question
xcode objective-c coredata
NSManagedObjectのサブクラスの自作メソッドを呼ぶとunrecognized selector sent to instanceが発生する


NSManagedObjectのサブクラスを生成して機能追加を行いたい場合  
1\. データモデルを作成する  
2\. Class - CodegenをManual/Noneにする  
[![Manual/None](https://i.stack.imgur.com/1ALfd.png)](https://i.stack.imgur.com/1ALfd.png)  
3\. メニューよりEditor - Create NSManagedSubclassを選択  
4\. 生成されたサブクラスに機能追加を行う  
5\. コンパイル・リンク

サブクラスを生成せず(機能追加をせず)CoreDataを利用する場合  
1\. データモデルを作成する  
2\. Class - CodegenをClass Definitionにする  
[![Class
Definition](https://i.stack.imgur.com/28lhm.png)](https://i.stack.imgur.com/28lhm.png)  
3\. コンパイル・リンク

この時、メニューからCreate
NSManagedSubclassでサブクラスを生成していた場合、リンク時に同名のクラスが既に存在する旨のエラーが発生する。（サブクラス一式をコンパイル・リンクの対象から外せばエラーは出なくなりますが、当然ながらこのまま実行すると例えば自分で追加したメソッドを呼び出した際は
unrecognized selector sent to instance が発生する）


CC BY-SA 3.0
2017-09-01T17:09:35.873
37670
2017-09-01T17:09:35.873
25139
37649
answer