1

原因が見つからないという警告があります。

ドキュメント ベースの画像スライド ショーを実装する Cocoa プログラミングに関するテキストの説明コードに従っています。この警告により、プログラムがクラッシュする原因となる適切な回数を超えて while ループが実行されます。著者の Web サイトからダウンロードしたコードには、この問題はありません。

私のバージョンのタイプミスの単純な問題だと思いましたが、両方のバージョンのコードを注意深く読んでも、違いを見つけることができませんでした。次に、自分のバージョンのすべての .h、.m、.xib およびその他のリソース ファイルを作成者のバージョンに体系的に置き換え、すべてのターゲットを消去し、置換ごとに再構築しました。

ただし、最終的に .xcodeproj ファイルを作成者のバージョンに置き換えるまで、警告は消えません。その時点で、警告はクリアされ、コードはクラッシュすることなく実行されます。次に、作成者のバージョンの .h および .m ファイルのそれぞれを一度に私の .h および .m ファイルに置き換え、すべてのターゲットを消去し、ビルドして、再び警告やクラッシュが発生しないようにするという別の方法を試しました。.plist ファイルの設定ではないかと思いましたが、そのファイルの 2 つのバージョンを入れ替えても効果がないようです。.xcodeproj バンドルの project.pbxproj ファイルに絞り込むことができるようですが、そこにリストされているビルド設定のいずれかが問題を引き起こす可能性があることはわかりません。

誰かが問題に対する洞察を提供したり、デバッグ方法を推奨したりできれば幸いです。while ループを含む警告と関連するコード セグメントは次のとおりです。

ビルド警告:

SlideShowDocument.m: In function '-[SlideShowDocument removeSlidesAtIndexes:]':
SlideShowDocument.m:191: warning: comparison is always true due to limited range of data type

デバッガー コンソール出力:

Slide Master[665:a0f] HIToolbox: ignoring exception '*** -[NSCFArray objectAtIndex:]: index (4294967295) beyond bounds (3)' that raised inside

コード:

- (void)removeSlidesAtIndexes:(NSIndexSet*)indexes;
{
    NSMutableArray *slideList = [NSMutableArray array];

    unsigned int index = [indexes firstIndex];

    while (index != NSNotFound) {
        Slide *slide = [mSlides objectAtIndex:index];

        [slideList addObject:slide];

        index = [indexes indexGreaterThanIndex:index];
    }

    if ([slideList count]) {
        //remove the slides from the master list

        [self recordSlideChange];

        [mSlides removeObjectsInArray:slideList];

        [self notifySlidesChanged];
    }
}
4

1 に答える 1

8

NSUIntegerよりも大きくなる可能性がありunsigned int、これはビルド ターゲット (32 ビットと 64 ビット、LP64 と ILP64) によって異なります。NSUIntegerから:

#if __LP64__ || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif

NSNotFoundに等しい列挙値であるターゲットの 1つがそうである場合NSIntegerMax(こちらを参照) は、 に収まりませんunsigned int。したがって、いくつかの整数昇格が行われ、次の行で等値にヒットすることはありません (コンパイラーが通知しています):

while (index != NSNotFound) {

(によってインデックスに使用される型)indexとして宣言すると、その問題は移植可能に解決されるはずです。NSUIntegerNSIndexSet

于 2011-09-03T16:39:11.590 に答える