web-dev-qa-db-ja.com

Xcode 5の「セマンティックな問題:宣言されていないセレクター」を修正する必要がありますか?

Xcode5でアプリをアップグレードしようとしていますが、サードパーティライブラリ(MagicalRecord)で多くの「セマンティックな問題」が発生しました。これを「修正」する最も簡単な方法は、次の方法を使用することです。

#pragma GCC diagnostic ignored "-Wundeclared-selector"

(from: 「未宣言のセレクタ」警告を取り除く方法

コンパイラ指令ですが、私の直感では、これは適切な方法ではないと述べています。上記のエラーを含む小さなコードサンプル:

+ (NSEntityDescription *) MR_entityDescriptionInContext:(NSManagedObjectContext *)context {

    if ([self respondsToSelector:@selector(entityInManagedObjectContext:)]) 
    {
        NSEntityDescription *entity = [self performSelector:@selector(entityInManagedObjectContext:) withObject:context];
        return entity;
    }
    else
    {
        NSString *entityName = [self MR_entityName];
        return [NSEntityDescription entityForName:entityName inManagedObjectContext:context];
    }
}

どこ entityInManagedObjectContext:メソッドはどこにも定義されていません。

これらのタイプのエラーを最適に修正する方法についての提案は、事前に感謝しますか?!

31
iOS-Coder

セレクタを含むクラスまたはプロトコルを宣言するだけです。例えば:

_//  DeliveryTimeComparison.h
#import <Foundation/Foundation.h>

@protocol DeliveryTimeComparison <NSObject>

- (void)compareByDeliveryTime:(id)otherTime;

@end
_

次に、@selector(compareByDeliveryTime:)を使用する予定のクラスで_#import "DeliveryTimeComparison.h"_を使用します。

または、「compareByDeliveryTime:」メソッドを含むオブジェクトのクラスヘッダーをインポートするだけです。

20
Abhi Beckert

はい、そうすべきです。

これを行う代わりに:

[self.searchResults sortUsingSelector:@selector(compareByDeliveryTime:)];

これを行う必要があります:

SEL compareByDeliveryTimeSelector = sel_registerName("compareByDeliveryTime:");
[self.searchResults sortUsingSelector:compareByDeliveryTimeSelector];
25
newton_guima

Xcode 5はデフォルトでこれをオンにしました。これをオフにするには、「Apple LLVM 5.0-警告-目標C」->「宣言されていないセレクタ」の下のターゲットの「ビルド設定」に進み、「いいえ」に設定します。これはそれの世話をする必要があります。

15
Jason Shehane

MagicalRecordのこれらのセレクター警告は、mogeneratorの生成されたCore Dataクラスとの互換性のためです。発生器を使用し、おそらくエンティティの1つをインポートする以外に、すでに回答されたもの以外にできることはほとんどありません。

もちろん、別のオプションは、そのコードを無視ブロックで具体的に囲むことです

#pragma clang diagnostic Push
#pragma clang diagnostic ignored "-Wundeclared-selector"

そして最後に

#pragma clang diagnostic pop
10
Keyd