2011-01-21 8 views
0

이 루프가 무슨 문제인지 정확히 모르겠지만 실행할 때마다 SIGABRT가 계속 나타납니다. 로그에 따르면 루프의 끝 부분에있는 NSMutable 배열에 NSNumber를 추가하려고하면 문제가 발생합니다. 분명히 초등 오류를 만들었지 만 문제가 무엇인지 잘 모르겠습니다.문제 루프에서 NSMutableArray에 추가

NSArray *toArray = [ourDictionary objectForKey:toString]; 
NSMutableArray *allValuesMArray = [[NSMutableArray alloc] init]; 
while (done == NO) 
{ 
    if (i == 10) 
     done = YES; 
      /* 
      *The job here is to multiply these three numbers together and store the 
      *product in the mutable array. It tells me NSObject did not recognize selector 
      *and then crashes. 
      *original and multiplyFrom are always the same value, and multiplyTo is updated 
      *from an array I made above from a p-list. 
      *I'm hoping I didn't make a ton of rookie mistakes here, but I'm new to dealing with 
      *NSMutableArray and such. 
      */ 

    NSNumber *original = [NSNumber numberWithDouble:convertThis]; 
    NSNumber *multiplyFrom = [NSNumber numberWithDouble:multiply]; 
    NSNumber *multiplyTo = [NSNumber numberWithDouble:[[toArray objectAtIndex:i] doubleValue]]; 
    NSNumber *product = [[NSNumber alloc] init]; 

    product = [NSNumber numberWithDouble:([original doubleValue] * 
              [multiplyFrom doubleValue] * 
              [multiplyTo doubleValue])]; 

    [allValuesMArray addObject:product]; 
      //This line ^^^ causes crash 
    i++; 
} 
NSArray *returnThisArray = allValuesMArray; 
[allValuesMArray autorelease]; 
return returnThisArray; 
+0

여기에 로그 기록을 추가 할 수 있습니까? – Sarah

+1

더 많은 코드, 특히'allValuesMArray'의 생성을 보여주십시오. 또한'[product release]'를 제거하면 나중에 충돌이 발생할 것입니다. 그리고 마지막으로, BOOL 타입에 대한 적절한 상수는'TRUE' /'FALSE'가 아닌'YES' /'NO'입니다. –

+0

아직 충분하지 않다면 더 많은 것을 보여주는 코드를 편집했습니다 당신이 볼 필요가있는 다른 것을 알려주십시오. 루프 위의 모든 것이 잘 작동 할 것이고, 내가 원하는 것을 얻는 최선의 방법을 정확히 모르겠습니다. 이 방법의 핵심은 toArray에서 숫자 목록을 읽고, 제품을 계산하고, 각 제품을 새 배열에 저장 한 다음 반환하고 p 목록에 작성하는 것입니다. – Justin

답변

0

allValuesMArray : [allValuesMArray release]를 출시했습니다.

이 시점에서 보유 개수가 0이므로 즉시 배열이 해제됩니다.

[allValuesMArray autorelease]를 사용해보세요. 이것은 나중에 배열을 해제 할 것이고, 호출 메소드가 미출력 배열을 사용하거나 나중에 사용할 수 있도록 배열을 유지할 기회를 제공 할 것입니다.

배열에 추가하기 전에 제품이 nil이 아닌지 확인할 수도 있습니다.

그리고 메모리 누수가 발생했습니다.

제품 = [[NSNumber alloc] init];

나중에 다른 개체에 할당합니다.

+0

나는 그것을 복사 할 때 실수를하기 전에 autorelease를했다. 내 문제는 루프 내부, 특히 line [allValuesMArray addObject : product]; – Justin

+0

제품이 0이 아닌 것은 확실합니까? [original doubleValue] * [multiplyFrom doubleValue] * [multiplyTo doubleValue]의 double 값은 무엇입니까? – martinws

+0

이 작동하는 것처럼 보입니다. 예를 들어 ([original doubleValue] * [multiplyFrom doubleValue] * [multiplyTo doubleValue])를 이중으로 지정하면 나에게 답을 주지만, 어떤 이유로 나는 이해하지 못합니다 변경 가능한 배열에 객체를 추가하는 올바른 방법은 ... – Justin

0

이것은 오타라고 생각하지만 포인터를 할당하지 않고 NSMutableArray 유형이 아니라 NSArray 유형을 할당하고 있습니다. 라인 번호를 확인하십시오. 2 :

NSMutableArray allValuesMArray = [[NSArray alloc] init]; 

NSMutableArray *allValuesMArray = [[NSMutableArray alloc] init]; 
+0

네, 그건 오타였습니다! – Justin

+0

@Justin 그럼 시간을 갖고 고쳐주세요. 둘 다! – danyowdee

0

당신이있는 NSArray를 작성하고있는 NSMutableArray에 할당 있습니까해야 하는가?

NSMutableArray* allValuesMArray = [[NSMutableArray alloc] init]; 
0

가 여기 청소 업 코드의 비 새는 형태 :

NSMutableArray *convertedValues = [NSMutableArray array]; 
// moved outside of the loop and descriptively named: 
double normalizedValue = convertThis * multiply; 
// make use of NSFastEnumeration -- better readability _and_ reliability 
for (NSNumber *scaleFactor in [ourDictionary objectForKey:toString]) 
{ 
    // just in case you want to add a breakpoint to see if everything works as expected: 
    double convertedValue = normalizedValue * [scaleFactor doubleValue]; 
    [convertedValues addObject:[NSNumber numberWithDouble:convertedValue]]; 
} 
return convertedValues; 

무언가가이 코드를 잘못되면

, 나는 배열이 [ourDictionary objectForKey:toString]에 의해 반환 내기 아마도 당신은 다음과 같은 의미 NSNumber가 아닌 인스턴스가 하나 이상 포함되어 있습니다. 이는 NSException[scaleFactor doubleValue]에 던져짐으로써 알 수 있습니다.

관련 문제