문제

다음 줄을 사용하여 CGRects로 NSArray를 생성합니다.

[self setMyArray:[NSArray arrayWithObjects:[NSValue valueWithCGRect:CGRectMake(x,y,z,a)], [NSValue valueWithCGRect:CGRectMake(x,y,z,a)], nil]]

그런 다음 다음과 같이 자주 배열의 CGlect를 업데이트하려고 합니다.

for (NSValue *bound in myArray)
  {
   CGRect myRect = [bound CGRectValue];
   myRect.origin.y += 2;
  }

그러나 이것은 작동하지 않습니다. 루프가 다시 실행될 때 원점은 여전히 ​​동일합니다.이것이 NSValue 래퍼와 관련이 있다고 가정합니다. 값이 실제로 배열에서 업데이트되도록 하려면 어떻게 해야 합니까?.감사합니다.

-오스카

도움이 되었습니까?

해결책

NSValue 개체는 변경할 수 없으므로 수행할 수 있는 작업이 없습니다.변경 가능한 배열을 사용하고 기존 개체를 새 직사각형이 포함된 새 NSValue 인스턴스로 바꿔야 합니다.

다른 팁

다른 사람들이 언급했듯이, NSValue 인스턴스는 변경할 수 없으므로 인스턴스를 다시 만든 다음 교체해야 합니다. NSMutableArray.

또 다른 옵션은 보다 '클래식' C 메모리 관리(malloc/free)를 사용하고 그런 방식으로 배열을 관리하는 것입니다.그 길로 가는 것은 아무 문제가 없습니다.Objective-C/Foundation API만큼 높은 수준이 아니므로 더욱 주의해야 합니다.

// Create an array to hold 100 rectangles
CGRect* rectangles = (CGRect*) malloc(100 * sizeof(CGRect));

// Change the rectangle at index 2 (remember arrays are 0 based, so this is the 3rd)
CGRect* rect = &rectangles[2];
rect->size.width /= 2.0;

// Shortcut for accessing rectangles
rectangles[2].size.width = 100.0;

// Get rid of the array
free(rectangles);

예를 들어 게임 작업을 하는 경우에도 더 빠를 수 있습니다.

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