2012-02-19 2 views
-1

Objecive-C를 배우고 루프에서 removeObject 메서드를 사용하려고합니다. 제대로 작동하지 않습니다. 나는 "스레드 1 : 프로그램 수신 신호 :"SIGABRT "를 암시합니다." 그 줄에. 무엇이 잘못 되었나요?Objective-C 이상한 오류 SIGABRT

NSMutableArray *bookListMutable = [NSMutableArray arrayWithObjects:@"TitleM 2", @"TitleM 4", @"TitleM 5", nil]; 
[bookListMutable addObject:@"TitleM 3 added"]; 
[bookListMutable insertObject:@"TitleM 1 inserted" atIndex:0]; 

long countMutable; 
countMutable = bookListMutable.count; 


for(int y = 0; y < countMutable; y++){ 
    [bookListMutable removeObject:[bookListMutable objectAtIndex:y]]; 
} 

P. xCode 4.1

+1

1) 시간, 엑스 코드 4.3있다. 2) SIGABRT는 일반적으로 예외입니다. 콘솔 확인 했니? –

+0

어떤 라인입니까? 또한, 왜 당신은'removeObjectAtIndex :'를 사용하지 않았는가, 아니면'removeAllObjects'와 같은 것일까? –

+0

이 책에서 운동을 시도했습니다. http://www.amazon.com/Objective-C-Absolute-Beginners-iPhone-Programming/dp/1430228326/ref=sr_1_2?ie=UTF8&qid=1329685777&sr=8-2 –

답변

0

로 카운트 다운에서 반복. 의 배열이 4 개 항목 {0, 1, 2, 3}을 가지고 말을하고 프로그램의 실행을 시뮬레이션 보자

  1. 첫 번째 반복 y = 0로 : {0, 1, 2, 3}에서 인덱스 0에서 항목을 제거는 {1, 2, 3}을 제공합니다. y = 1

  2. 두 번째 반복 : {1, 2, 3}에서 인덱스 1에서 항목을 제거는 y = 2{1, 3}

  3. 세 번째 반복을 제공합니다 {1, 3}에서 인덱스 2에서 항목을 제거하여 준다. 인덱스 2 => 예외에는 항목이 없습니다.

    for(int y = countMutable-1; y >= 0; y--) { 
        [bookListMutable removeAtIndex:y]]; 
    } 
    

    또는 방법에 빌드를 사용하십시오 :

그래서 당신은 다음과 같이 거꾸로 반복한다 업데이트

[bookListMutable removeAllObjects]; 
+0

아주 명확한 설명을 해주셔서 감사합니다 =) –

2

문제는 잘못된 순서로 항목을 제거한다는 것입니다. 인덱스 0에서 항목을 제거하면 모든 인덱스가 1 씩 감소합니다. 그래서 당신은이 작업을 수행 할 수 있습니다

for(int y = countMutable-1; y >= 0; y--) { 
    [bookListMutable removeObject:[bookListMutable objectAtIndex:y]]; 
} 

나이 :

for(int y = 0; y < countMutable; y++) { 
    [bookListMutable removeObject:[bookListMutable objectAtIndex:0]]; 
} 

(난 당신의 코드에 약간의 수정으로이 떠날거야,하지만 일을 더 나은 방법이 있다는 것을 유의하고 싶습니다 예 : removeObjectAtIndex: 사용 https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSMutableArray_Class/Reference/Reference.html)

+0

감사합니다. 당신, 이제는 효과가 있습니다. –

1

코드에 문제가있을 수 있지만 최악의 경우를 볼 수 있습니다. 인덱스 0에서 시작하는 배열의 객체를 삭제합니다. , 카운트까지 올라간다. 이것은 i = 0,1,2,3을 뜻하며 배열은 요소를 0 위치로 이동합니다. 이것은 예외를 던지며 배열의 절반 만이 이런 식으로 지울 수 있습니다.

대안 : 어레이 ([bookListMutable removeAllObjects])를 해제하는 방법을 사용하거나, 그 순서대로 항목을 제거하지 말아야 0