5

最近、Xcode をバージョン 5.1 に更新しました。更新後、iOS 7.1 を除くすべてのシミュレーターで問題なく動作します。iOS 7.1 では mach-O リンク エラーが発生します。さらに、[ビルド設定] タブには 64 ビット アーキテクチャ オプションしかありません。私によると、それがすべての問題とエラーの原因です。これの理由と解決方法を知っている人はいますか?

ここに私が持っているいくつかの警告とエラーがあります:

警告 :

Values of type 'NSInteger' should not be used as format arguments; add an explicit cast to 'long' instead

エラー:

Symbol(s) not found for architecture x86_64

ありがとう。

4

3 に答える 3

14

Xcode 5.1 では、標準のプロジェクト設定が変更されました。とりわけarm64、プロジェクトのアーキテクチャが含まれるようになりましたが、多くのサードパーティ プロジェクトはまだサポートしていないため、アーキテクチャarmv7設定から再度削除することをお勧めします ( とを残しますarmv7s)。ただし、有効なアーキテクチャ設定のままにしてください。これにより、実行できるアーキテクチャが指定されます。

また、typecast to long warning など、いくつかの追加の警告のデフォルトのアクティブ化も導入しました。ここでは同じカウントです。他のかなりの数のライブラリを (ソース コードとして) 使用すると、できない (またはしたくない) 警告がたくさん表示される可能性があります。 to) 多くのことをする。これらのプロジェクトの警告を再度無効にするか、プロジェクト設定をすぐに更新しないことを選択できます。

于 2014-03-13T08:09:02.420 に答える
3

実際、XCode には arm64 アーキテクチャが含まれるようになりました。NSInteger は、 NSObjCRuntime.h で定義されているため、完全に異なるものになりました。

#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif

それに対処するには、コードベースを改善する必要があります。まず第一に、あなたは本当に一貫している必要があります。NSInteger を int ではなく NSInteger にのみ割り当てます。あらゆる種類の回避:

int i = [aString integerValue] (NSInteger を返すため)

しかし

NSInteger i = [aString integerValue] (そして、長い型であれば問題ありません。)

さらに、別の問題として、値から文字列を作成する場合があります。あなたができることは次のようなものです:

#define cL(v)    (long)(v)
#define cUL(v)   (unsigned long)(v)

NSLog(@"array.count: %ld", cUL(anArray.count));

array.count は、armv7(s) では unsigned int を返し、arm64 では unsigned long を返します。常に unsigned long にキャストすることで、警告が表示されなくなり、さらに重要なことに、バグが発生しなくなります。

この「ロジック」は、Apple 自身がいくつかのテクニカル トーク ビデオで紹介しています: https://developer.apple.com/tech-talks/videos/ (ビデオ「Architecting Modern iOS Games」。ビデオを 10 分頃に再生してください)

于 2014-03-14T14:12:14.430 に答える