2012-01-12 5 views
0

배열을 받아 NSObject 속성에 저장하는 메서드가 있습니다.개체 값 복사

- (void)updatePoints:(NSArray *)pointArrayPassed 
{ 
    pointArray = pointArrayPassed; 
    pointCount= pointArray.count; 
} 

는 호출 스택을 반영 할 때 내가 할 수있는 분명 그렇게 pointArrayPassed의 포인터를 유지하지만, 다음 코드 작동합니다. 그러나 내가 pointArrayPassed의 복사본을 사용하면 앱이 크게 유출되기 시작합니다!

포인터 대신 값만 전달할 수있는 방법이 있습니까?

+0

어떻게 복사합니까? 'pointArray = [pointArrayPassed copy]'? – kennytm

+0

예, 죄송합니다. 그걸 추가하는 것을 잊어 버렸습니다. –

+2

나는 당신이 말하는 것을 이해할 수 없습니다. 변수를 선언하는 방법, 수명 등을 지정하거나 "언제 호출 스택을 반영 할 수 있는지"를 지정하지 않습니다. –

답변

2

현재 개체를 놓지 않고 붙이는 복사본을 iVar에 보관할 수 없습니다. 그렇지 않으면 release 메시지를 보낼 수있는 포인터를 잃어버린 것입니다. 이것이 그 곳의 모든 곳에서 누출되는 이유입니다.

이것은 더 나은 대체품입니다.

- (void)updatePoints:(NSArray *)pointArrayPassed 
{ 
    if (pointArray == pointArrayPassed) { 
     //the new array is the same as the current one. Do nothing 
     return; 
    } 
    [pointArray release]; 
    pointArray = [pointArrayPassed copy]; 
    pointCount = pointArray.count; 

} 

그러나이 그 일을 가장 우아한 방법이 아니다.

더 좋은 방법은 pointAlray를 메모리 관리 의미로 copy 인 속성으로 선언하는 것입니다 (변경 가능/변경 불가능한 클래스 클러스터가있는 경우에는 분명합니다). 그리고 필요할 때 카운트를 반환하는 -pointCount이라는 별도의 메소드가 있습니다.