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:
メソッドはどこにも定義されていません。
これらのタイプのエラーを最適に修正する方法についての提案は、事前に感謝しますか?!
セレクタを含むクラスまたはプロトコルを宣言するだけです。例えば:
_// DeliveryTimeComparison.h
#import <Foundation/Foundation.h>
@protocol DeliveryTimeComparison <NSObject>
- (void)compareByDeliveryTime:(id)otherTime;
@end
_
次に、@selector(compareByDeliveryTime:)
を使用する予定のクラスで_#import "DeliveryTimeComparison.h"
_を使用します。
または、「compareByDeliveryTime:」メソッドを含むオブジェクトのクラスヘッダーをインポートするだけです。
はい、そうすべきです。
これを行う代わりに:
[self.searchResults sortUsingSelector:@selector(compareByDeliveryTime:)];
これを行う必要があります:
SEL compareByDeliveryTimeSelector = sel_registerName("compareByDeliveryTime:");
[self.searchResults sortUsingSelector:compareByDeliveryTimeSelector];
Xcode 5はデフォルトでこれをオンにしました。これをオフにするには、「Apple LLVM 5.0-警告-目標C」->「宣言されていないセレクタ」の下のターゲットの「ビルド設定」に進み、「いいえ」に設定します。これはそれの世話をする必要があります。
MagicalRecordのこれらのセレクター警告は、mogeneratorの生成されたCore Dataクラスとの互換性のためです。発生器を使用し、おそらくエンティティの1つをインポートする以外に、すでに回答されたもの以外にできることはほとんどありません。
もちろん、別のオプションは、そのコードを無視ブロックで具体的に囲むことです
#pragma clang diagnostic Push
#pragma clang diagnostic ignored "-Wundeclared-selector"
そして最後に
#pragma clang diagnostic pop