문제

이 작은 코드가 있습니다

 NSMutableArray *myArray = [[NSMutableArray alloc] init]; 
 NSNumber *myNumber = [NSNumber numberWithDouble:752.65];

 [myArray addObject:myNumber];

이 코드를 사용하면 객체를 배열 안에 저장합니다. 그러나 지금 나는 서로 독립적 인 두 개의 물체가 있습니다.

배열에 추가 된 후 MyNumber를 변경하면 배열 내부의 값이 변경되지 않습니다. 어떻게 보관할 수 있습니까? 배열에만 포인터를 주려고했지만 작동하지 않았습니다.

도움이 되었습니까?

해결책

당신은 넣을 수 없습니다 변하기 쉬운 배열로, 그것이 바로 그 것입니다 myNumber IS : 변수. 변수는 컨테이너이며 배열도 마찬가지입니다. 차이점은 변수가 배열과 마찬가지로 객체*가 아니라는 것입니다. 객체를 배열에만 넣을 수 있습니다.

당신이 전달하는 것 addObject: 변수가 아닙니다 myNumber, 그러나 그것이 포함 된 객체. 그것이 당신이 배열에 추가하는 것입니다.

내부의 객체 대신 변수를 추가하려면 addObject:&myNumber, 변수 자체에 대한 포인터를 전달하기 위해. 그러나 이것은 두 가지 이유로 작동하지 않습니다.

  1. 앞서 언급했듯이 변수는 객체가 아니며 객체 만 추가 할 수 있습니다.
  2. 이것은 로컬 변수이므로 함수가 종료 될 때 멸망합니다. 그런 다음 배열 안에 죽은 메모리에 대한 포인터가 있습니다. 해당 포인터에있는 모든 것에 액세스 할 때 프로그램이 충돌합니다.

작동하는 세 가지 솔루션이 있습니다.

  1. f3lix에서 알 수 있듯이, 변수 숫자 클래스를 만들고 nsnumber 대신이 클래스에서 숫자 객체를 만듭니다. 다음과 같은 NSValue의 모든 원시 방법을 무시해야합니다. NSNUMBER 문서.
  2. 배열을 돌리는 대신 배열의 객체를 교체하십시오. 물론, 이것은 숫자를 변경하려는 모든 곳에서 배열에 액세스 할 수 있어야합니다.
  3. 숫자를 속성으로하는 모델 객체 클래스를 만듭니다.

마지막 해결책은 제 생각에 올바른 해결책입니다. 나는 당신이 숫자 목록 만 관리하고 있다고 의심합니다. 아마도, 당신은 사용자에게 숫자를 속성으로 가진 무언가의 목록을 보여줄 것입니다. 코드에서 이것을 모델링하면 모든 것이 훨씬 간단 해집니다.

베어 NSNUMBERS를 모델 객체로 교체 한 후 코드는 다음과 같습니다.

MyModelObject *myModelObject = [[[MyModelObject alloc] init] autorelease];
[myModelObject setNumber:[NSNumber numberWithDouble:42.0]];
[myArray addObject:myModelObject];

//Some time later, you decide to change the number.
[[myArray objectAtIndex:idx] setNumber:[NSNumber numberWithDouble:43.0]];
//Or:
for (MyModelObject *obj in myArray) {
    [obj setNumber:1000.0];
}

*나는 코코아 물체를 의미합니다. C 언어는 포인터, int 등을 호출합니다. "객체"는 다른 정의입니다.

다른 팁

문제는 NSNUMBER 개체가 있다는 것입니다 불변; 당신이 그들의 가치를 바꿀 수 없다는 것을 의미합니다. 따라서 값을 변경하려면 새 nsnumber 객체를 만들어야합니다. 예 :

myNumber = [NSNumber numberWithDouble:[myNumber doubleValue]+1.0]

물론, 당신은 배열에 추가 한 것과는 다른 물체에 대한 MyNumber 포인트를 가지고 있습니다. 따라서 변경된 NSNUMBER 개체를 대체하여 배열을 업데이트해야합니다.

[myArray replaceObjectAtIndex:0 withObject:myNumber]

글쎄, 이것은 배열을 업데이트 할 수 있도록 각 nsnumber와 함께 인덱스를 저장 해야하는 문제가 있습니다. NSNUMBER 객체를 전달하고 값을 변경하려는 경우에는 불분명합니다.

투명한 업데이트를 허용하기 위해 NSNumber 주위를 감싸는 래퍼 객체를 소개 하여이 문제를 해결하거나 DoubleValue를 처리하는 자신의 클래스를 만들 수 있습니다 (다소 변한 NSNumber 클래스).

포인터 마이너 너 너를 변경하면 말했듯이 배열에 저장된 값은 변경되지 않습니다. 그러나 배열에 저장된 포인터는 MyNumber의 사본이므로, MyNumber가 배열 요소가 동일한 개체이기 때문에 해당 변경을 반영하는 객체를 가리키는 객체를 변경하면.

당신이하고 싶은 것은 배열이 다른 객체 (mynumber를 변경할 때마다)를 가리키는 것입니다. 예를 들어 -replaceobjectindex : withobject :, like :

NSNumber *myNumber = [NSNumber numberWithDouble: 3.141592];
int myNumberIndex = [myArray count];
[myArray addObject: myNumber];

myNumber = ...; //whatever
[myArray replaceObjectAtIndex: myNumberIndex withObject: myNumber];

이 코드는 기본적으로 MyArray에 넣은 객체의 색인을 저장 한 다음 해당 객체를 새 개체로 바꾸는 것입니다.

당신이 좋아하는 것 같네요 NSPointerArray...

NspointerArray는 아마도 가장 강력한 (이) 전문 컬렉션 클래스 중 하나 일 것입니다. 지정합니다 NSArray-인터페이스와 비슷하지만 널 값 (및 임의의 포인터)을 삽입 할 수 있습니다. 또한 인스턴스를 만들 때 특정 옵션을 지정하여 NSPointerArray , 배열은 그 안에 저장된 개체와 관련하여 특정 메모리 관리 정책을 갖도록 구성 할 수 있습니다.

메소드를 사용하여 생성 할 때 nspointerArray 인스턴스에 대한 옵션을 지정합니다. -initWithOptions: 또는 -initWithPointerFunctions:. 메소드 -initwithOptions를 사용하는 경우 :`, 생성하는 배열이 매개 변수로 전달하는 옵션에 의해 명시된 정책을 준수하도록 지정합니다. 비트 또는 배열에 대한 특정 정책 또는 "성격"을 설정하여 지정된 옵션.

그리고 그것은 계속됩니다 ...

이 인스턴스를 전달할 때 NSPointerArray, 그런 다음 정상 고정, 릴리스 및 정상에서 사용될 기타 방법 대신 객체를 삽입, 제거 등으로 정의 한 함수를 사용합니다. NSArray.

출처 (하지만 더 알고 싶다면 다른 곳을 볼 것입니다)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top