2009-04-11 4 views
0

나는이 속성 접근으로의 CALayer의 하위 계층을 받고 있어요 :@property (copy) - 전체 복사본이 만들어지고 있습니까?

// @property(copy) NSArray *sublayers 

NSArray* layer = mylayer.layer.sublayers; 

이 속성이 "복사"를 사용하기 때문에, 때마다 나는 단순히 실행 :

mylayer.layer.sublayers 

는 서브 레이어의 전체 사본입니다 배열이 나를 위해 만들어지는거야? 그렇다면 그게 나쁠 수도 있습니다. 왜냐하면 제가 100 개 이상의 레이어를 가질 수 있기 때문에 확실히 거대한 복사본을 만들고 싶지 않기 때문입니다. 난 그냥

다음 복사, 당신에게

답변

2

당신은 '사본'선언을 사용하고 당신에게 @synthesize 속성을 감사 수를 얻고 기존의 계층, 기존 층에 단지 포인터를 통해 반복 찾고 있어요 속성을 설정할 때 사용됩니다.

예를 들어, 하위 레이어 배열에 대한 포인터 만 제공하는 값에 액세스하고 있습니다.

Here's a link이 시점에서 ADC 설명서에 제공됩니다.

업데이트

  1. IIRC는 런타임 설정되는 객체가 변경 가능한지 알고 똑똑. 불변의 오브젝트가 프로퍼티에 건네지고있는 경우, 그 오브젝트는 그대로 보존되어 카피되지 않습니다.
  2. 수정할 수있는 변경 가능한 개체를 전달하는 경우에는 개체에 mutableCopy을 호출하는 사용자 지정 작성기를 작성해야합니다. 이것은 내가 제공 한 documentation link에 나와 있습니다.
+0

이것은 정확합니다. 복사는 속성을 사용할 때만 (또는 setSublayers :)를 호출 할 때 발생합니다. –

1

내가 Abizern 그래서 내가이 말을하자 내가 당신의 대답을 이해 확실하지 않다 :

당신이 재산 (복사)를 사용하는 경우 해당 객체의 새로운 복사본을 너무 낭비 될 만드는 것입니다 많은 기억. 나는 그들이 왜 그렇게하는지 모르겠다. 그들은 값을 변경으로부터 보호하기를 원한다면 대신에 (읽기 전용으로) 대신 사용할 수있다. 게다가 Obj-C에서는 대부분의 값 클래스가 불변이므로 어쨌든 값을 변경할 수 없습니다.

+0

OP의 문제를 이해함에 따라 그는 부동산에 액세스 할 때마다 하위 레이어 배열의 복사본을 만들고 있다고 걱정했습니다. 나는 복사본이 속성을 설정할 때만 사용된다고 말하려고했습니다. 속성을 얻는 것은 객체에 대한 포인터를 반환합니다. – Abizern

+0

아, 잡았다, 해명 해줘서 고마워. –

+0

그들이'copy'를 사용하는 이유는 그들이 외부 적으로 배열에 대한 수정을 막기 위해서입니다. 그들이 'copy'대신에 'retain'을 사용했다면, NSMutableArray를 setSublayers :로 전달한 다음 레이어의 뒤쪽에서 변경할 수 있습니다. –

관련 문제