2012-10-18 4 views
0

사용자 설정에 따라 변경 될 인스턴스 배열이 있습니다. 인스턴스 변경 NSArray

@property (strong, nonatomic) NSArray *pointArray; 

내가 배열을 변경해야

, 난이 일을 봤는데 : :

-(void)changePointArray 
{ 
    NSMutableArray *tempArray = [NSMutableArray arrayWithArray:self.pointArray]; 

    // Make changes 

    self.pointArray = [NSArray arrayWithArray:tempArray]; 
} 

이 허용 연습 아니면 내가 누출을 만드는 오전 나는 불변있는 NSArray로 설정? 방금 대신에 타입 변환해야합니까 :

self.pointArray = (NSArray *)tempArray; 

NSMutableArray를 NSArray로 설정하는 것에 대해 걱정할 필요가 있습니까?

self.pointArray = tempArray; 
+0

[self.pointArray mutableCopy]를 시도해 보셨습니까? – CBredlow

+1

'arrayWithArray'가 자동으로 렌더링 된 객체를 반환하기 때문에 누출되지 않습니다. – MrBr

답변

1

아니요, 메모리 관리와 관련하여 누수가 없습니다.

공용 인터페이스에서 상호 배열을 노출시키지 않으려면 코드가 절대적으로 좋습니다.

그러나 여기서 추상화를 신경 쓰지 않거나 해당 속성이 공개되지 않은 경우 먼저 NSMutualArray * 속성을 선언하는 것이 더 쉽습니다.

1

당신은 NSArray의 서브 클래스입니다이 self.pointArray = tempArray;NSMutableArray 때문에 걱정할 필요가 없습니다. 어쩌면 조금 더 많은 메모리가 NSMutableArray에 할당되었지만 전혀 문제되지 않습니다. 걱정하지 마십시오.

물론 당신은 아직도 당신이

@property (strong, nonatomic) NSMutableArray *pointArray;

이 있고 당신이 self.pointArray = tempArray;이 tempArray 있었다 일을하려고한다면 self.pointArray = [NSArray arrayWithArray:tempArray];

당신은하지만 반대의 경우에 문제가있을 것이라고 할 수는 NSArray*

입니다

그리고 self.pointArray = (NSMutableArray*)tempArray;을 시도하면 문제가 발생할 수 있습니다.

0

콘텐츠를 변경하거나 수정할 수있는 경우 가장 좋은 해결책은 NSArray 대신 NSMutableArray을 사용하는 것입니다.

NSArray을 사용해야하는 특별한 이유가있는 경우 다음 코드가 최선의 해결책입니다.

self.pointArray = [NSArray arrayWithArray:tempArray]; 
2

귀하의 우려 사항은 무엇입니까? 그러한 시나리오의 경우 원 자성, 배열을 수정하는 다른 사람에 대한 보안, 어느 쪽이든 또는 둘 다에 대해 우려 할 수 있습니다. 둘 다 관심이 없다면 속성을 NSMutableArray로 만들고 그 위치에서 수정하십시오.

원자력에 대해 걱정이된다면 복사본을 만들고 사본을 수정 한 다음 바꿔 넣어야합니다 (물론 개체의 모든 사용자는 포인터의 개인 복사본을 알아야합니다) 일련의 "원자"참조, 각 참조의 특성을 다시 참조).

보안을 위해 배열을 변경할 수없는 NSArray로 설정하고 속성을 읽기 전용으로 설정해야합니다.

+0

예, 변경할 수있는 배열을 사용하는 것이 금기인지 아닌지 잘 모르겠습니다. 그래서 빠른 Google 검색을 수행했습니다. 이러한 이유로 불변성을 주장하는 부부를 찾았습니다. 그것을 읽기 전용으로 만드는 것에 대해 생각하지 않았습니다. TBH,이 프로그램으로 원 자성에 대해 걱정할 필요는 없지만 좋은 연습이 될 것이라고 생각했습니다. – Padin215

+0

@ Log139 - 물론 작은 그룹의 사람들이 모든 출처에 액세스 할 수 있고 무엇이든 바꿀 수 있기 때문에 "보안"은 99 %의 앱에서 중요하지 않습니다. 그리고 Objective-C는 자바가 어쨌든 "안전"하지 않습니다. "보안"은 우발적 인 수정을 막을뿐입니다. "이런, 나는 정말로 '올바른'방식으로해야하지만, 시간이 없다 '라는 수정을합니다. –