3

iOS プロジェクトを分析すると、このエラーが発生します

The left operand of '==' is a garbage value

これは、コードが発生する場所のように見えるものです。このメソッドは、DB から返された配列をソートするために使用されます。

- (NSMutableArray *)startSortingTheArray:(NSMutableArray *)unsortedArray
{
    [unsortedArray sortUsingComparator:^ NSComparisonResult(SearchResultItem *d1, SearchResultItem *d2) {
        //initalize comparison
        NSComparisonResult result;

        NSInteger manufacturerID1 = d1.manufacturerID;
        NSInteger manufacturerID2 = d2.manufacturerID;
            if (manufacturerID1 > manufacturerID2)
                return NSOrderedAscending;
            if (manufacturerID1 < manufacturerID2)
                return NSOrderedDescending;
            if (manufacturerID1 == manufacturerID2) {

            NSString *model1 = d1.model;
            NSString *model2 = d2.model;
            result = [model1 localizedCompare:model2];
        }
        if (result == NSOrderedSame) {
//..
4

2 に答える 2

5

==値を持つ前に比較に到達できると考えているため、コンパイラは不平を言っresultています。

コードに与えられた最良のオプションは、else ifandを使用することelseです。

if (manufacturerID1 > manufacturerID2)
    return NSOrderedAscending; // we won't reach the comparison so result doesn't matter
else if (manufacturerID1 < manufacturerID2)
    return NSOrderedDescending; // we won't reach the comparison so result doesn't matter
else {
    NSString *model1 = d1.model;
    NSString *model2 = d2.model;
    result = [model1 localizedCompare:model2]; // in any other case, result will be set.
}
...

または、次のようにすることもできます。

NSComparisonResult result;
...
if (manufacturerID1 > manufacturerID2)
    return NSOrderedAscending;
else if (manufacturerID1 < manufacturerID2)
    return NSOrderedDescending;

NSString *model1 = d1.model;
NSString *model2 = d2.model;
result = [model1 localizedCompare:model2];
...

またはこれでも:

if (manufacturerID1 > manufacturerID2)
    return NSOrderedAscending;
else if (manufacturerID1 < manufacturerID2)
    return NSOrderedDescending;

NSComparisonResult result = [d1.model localizedCompare:d2.model];
...

このようにして、コンパイラーは、比較に到達した場合、 の値resultが既に設定されていることを認識します。

于 2012-10-11T20:42:13.593 に答える
0

llvm の「ソルバー」が、manufacturerID[12] の比較に関して、<、>、または == のいずれかが真でなければならないことを理解していないだけだと思います。if (manufacturerID1 == manufacturerID2)の値が初期化されていないことがわかるように、ブロックを削除してみてくださいresult。あなたのコメントにもかかわらず、実際にはその値を初期化していません。

于 2012-10-11T20:43:20.127 に答える