2013-06-15 3 views
0

저는 최근에 소프트웨어 개념에 익숙하지 않지만 코코아 및 Objective-C로 작업하기 시작했습니다. NSMutableArray 클래스에서 몇 가지 궁금하고 예기치 않은 동작이 나타납니다.NSMutableAray RemoveObject : 예상대로 작동하지 않습니다.

먼저, 'CustomClass'클래스의 사용자 지정 개체를 사용하여 'NSMutableArray'개체를 만들고 채 웁니다. 그런 다음 개체 중 하나를 삭제하려고 시도하고 원하는 결과를 얻지 못합니다. 내가 원하는대로 간단하게, 네 번째 항목을 제거하는이 코드는,이 '전무'(즉, (ID)을 0x00000000)에 네 번째 항목을 설정하고, 더 혼동, 은을 삭제하는 대신

// NSMutableArray *Array is already initialized and loaded with 5 CustomClass Objects 
// stored in variables 'CustomClassObject1' through 'CustomClassObject5'. 
[Array removeObject:CustomClassObject4]; 

배열의 마지막 항목

제 생각에 이것은 일어나지 않아야합니다 - 네 번째 항목은 제거되어야하고 5 번째로 대체되어야합니다. 대신, 저는 이제 3 개의 객체와 하나의 무로 배열을 가지고 있습니다!

또한 만 같은 결과를 얻을

int position = [Array indexOfObject:CustomClassObject4]; 
[Array removeObjectatIndex:position]; 

을 시도했습니다. 왜 이런 일이 일어나는 지 아는 사람이 있습니까? 내가 뭔가를 오해하고 있니?

감사합니다.

코드 : 그런 다음

_Array = (NSMutableArray *) 0x0885c2c0 @ "5 Objects" 
[0] = (CustomClass *) 0x0885c5f0 
[1] = (CustomClass *) 0x0885c630 
[2] = (CustomClass *) 0x0885c690 
[3] = (CustomClass *) 0x0885c6f0 
[4] = (CustomClass *) 0x0885c730 

:

이 시점에서
[Array removeObject:CustomClassObject4]; 

출력 :

_Array = (NSMutableArray *) 0x0885c2c0 @ "4 Objects" 
[0] = (CustomClass *) 0x0885c5f0 
[1] = (CustomClass *) 0x0885c630 
[2] = (CustomClass *) 0x0885c690 
[3] = (id) 0x00000000 
이 시점에서

NSMutableArray *Array = [NSMutableArray array]; 

CustomClass *CustomClassObject1 = [[CustomClass alloc] init]; 
CustomClass *CustomClassObject2 = [[CustomClass alloc] init]; 
CustomClass *CustomClassObject3 = [[CustomClass alloc] init]; 
CustomClass *CustomClassObject4 = [[CustomClass alloc] init]; 
CustomClass *CustomClassObject5 = [[CustomClass alloc] init]; 

[Array AddObject:CustomClassObject1]; 
[Array AddObject:CustomClassObject2]; 
[Array AddObject:CustomClassObject3]; 
[Array AddObject:CustomClassObject4]; 
[Array AddObject:CustomClassObject5]; 

출력

대신 내가 3 개체를 삭제하면

[Array removeObject:CustomClassObject3]; 

출력은 다음과 같습니다

NSMutableArray *array = [NSMutableArray new]; 
[array addObject: [[CustomClass alloc] init] ]; 
// repeat for as many times you want. 

// Fast enumerate the loop and get an output - You class will need to provide method id 
for (CustomClass * c in array) NSLog(@"Class id: %@", [c id]); 

// Then try to delete any random object. 
[array removeObjectAtIndex: [array indexOfObject: object] ]; 

// And repeat the enumeration 
for (CustomClass * c in array) NSLog(@"Class id: %@", [c id]); 

이 시도하고 말씀해 주시겠습니까 :

_Array = (NSMutableArray *) 0x0885c2c0 @ "4 Objects" 
[0] = (CustomClass *) 0x0885c5f0 
[1] = (CustomClass *) 0x0885c630 
[2] = (id) 0x00000000 
[3] = (CustomClass *) 0x0885c6f0 
+0

배열에 객체를 설정 한 후 모든 값을 출력하고 마지막 행을 확인하십시오. 마지막 클래스가 초기화되지 않았을 수 있습니다. – Warewolf

+0

초기화 된 방법과 배열 내부의 내용을 이해할 수 있도록 여기에 전체 코드를 게시하십시오. 객체를 삽입 한 후 배열을 인쇄하여 출력하십시오. – Warewolf

+0

'NSMutableArray'가이 동작을하고 있습니까? 이러한 예기치 않은 결과를 얻기 위해 사용하는 코드를 게시하십시오. – Greg

답변

0

당신이 간단하게 뭔가를 시도하십시오 수 어떻게 된 거예요? 또한 각 추가 및 삭제 작업에서 중단 점을 추가하십시오.

아크가 활성화되어 있고 코드가 자동 복구 풀 내에 있는지 확인하십시오!

+0

이 코드는 removeObjectAtIndex가 호출 된 후 예상대로 작동합니다. 고마워, 나는 이것을 출발점으로 사용할 수있다. 실제로 나는 누군가가 이전에 그것을 보았는지를 알고 싶었습니다. 모두 도와 주셔서 감사합니다. –

2

ARC가 지역 변수를 처리하는 방법까지 모두 다 나와 있습니다. 때를 그렇게

NSMutableArray *Array = [NSMutableArray array]; 

//All of these are initialized with a +1 retain count 
CustomClass *CustomClassObject1 = [[CustomClass alloc] init]; 
CustomClass *CustomClassObject2 = [[CustomClass alloc] init]; 
CustomClass *CustomClassObject3 = [[CustomClass alloc] init]; 
CustomClass *CustomClassObject4 = [[CustomClass alloc] init]; 
CustomClass *CustomClassObject5 = [[CustomClass alloc] init]; 

//The array retains what gets put into it, meaning it owns these variables 
//And gives them a total reference count of +2 
[Array AddObject:[CustomClassObject1 retain]]; 
[Array AddObject:[CustomClassObject2 retain]]; 
[Array AddObject:[CustomClassObject3 retain]]; 
[Array AddObject:[CustomClassObject4 retain]]; 
[Array AddObject:[CustomClassObject5 retain]]; 

//The compiler inserts a release for each of those objects because you 
//Don't reference them before the method's scope ends. The array still owns 
//them, so they all have a total reference count of +1 at this point. 
[CustomClassObject1 release]; 
[CustomClassObject2 release]; 
[CustomClassObject3 release]; 
[CustomClassObject4 release]; 
[CustomClassObject5 release]; 

객체를 제거

가, 배열이 그것의 참조 카운트를 감소 : 잠시 동안, 난 당신의 코드가 메모리 설명을 위해 관리하는 방법을 보여 ARC를 해제하는 척하는거야 CustomClassObject4을 제거하면 참조 횟수가 큰 뚱뚱한 0으로 떨어지고 할당이 해제됩니다. 그것은 당신이보고있는 것이 아닙니다.이 문제를 해결하려면 강력한 iVars, 속성 또는 전역에서 해당 메서드의 범위를 벗어난 개체를 유지하십시오.

+0

메모리 관리가 이미 여러 번 오류를 일으켰습니다. 릴리스 된 호출 객체가 이미 앱을 종료합니다. +1이이 친구에게 +1합니다. – Warewolf

+0

감사합니다. CodaFi 덕분에 좋겠지 만 CustomClassObject4를 다른 * 배열에 추가했습니다. 나는 그것을 제거하고 동일한 결과가 발생했습니다. –

+0

그런 다음 어레이가 범위를 벗어나서 – CodaFi

관련 문제