2016-09-07 8 views
-1

私はAppCodeを使って、私がXCodeで書いたコードを微調整します。 AppCodeはすばらしいコード検査を行い、物事が改善される場所を教えてくれます。NSUIntegerはforループと奇妙です

私は[SomeObjCFrameworkClass objectAtIndex]が実際に真であるNSUIntegerを期待していることを指摘出くわす頻繁な検査の一つ...

- (ObjectType)objectAtIndex:(NSUInteger)index 

は、しかし、私は自分自身がこのアドバイスに従うことを試みることによってめちゃくちゃ見つけておくと、 intNSUIntegerに変更してください。

例えば、ここで私はこの変更をした際に爆発したコードの一枚...

-(void)removeBadge 
{ 
    if ([[theButton subviews] count]>0) 
    { 
     NSUInteger initalValue = [[theButton subviews] count]-1; 
     //Get reference to the subview, and if it's a badge, remove it from it's parent (the button) 
     for (NSUInteger i=initalValue; i>=0; i--) { 

      if ([[[theButton subviews] objectAtIndex:i] isMemberOfClass:[MKNumberBadgeView class]]) 
      { 
       [[[theButton subviews] objectAtIndex:i] removeFromSuperview]; 
       [theButton setTitleColor:[UIColor lightTextColor] forState:UIControlStateNormal]; 
      } 
     } 
    } 
} 

なぜこれが起こっているすべてのアイデアです。 以下に描かれているデバッグデータには手掛かりがありますが、わかりません。

enter image description here

+1

* unsigned *の整数の場合、i = 0は* always * trueです。ループは終了せず、整数は「ラップアラウンド」します。 –

+1

「AppCodeはすばらしいコード検査を行います。 – matt

答えて

2

符号なしでNSUIntegerので、あなたのforループ内i>=0条件は常にYESに評価されます。 iが0に達した後、次の反復で整数アンダーフローが発生し、iNSUIntegerMaxになります。

更新:あなたのコードからわかる限り、サブビューを逆順に処理する理由はありません。だから、あなたは、単にそれ以外の場合は

for (NSUInteger i=0; i<theButton.subviews.count; i++) 

を行うことができ、あなたのループ内

if (0 == i) { 
    break; 
} 

のようなものを使用するか、または例えばdo/whileを使用することができます。

+0

さて、わかりました。だから提案された修正は何ですか?私は単純に 'int'や' NSInteger'を使うよりも良いものを望んでいます –