내부적으로 NSMutableArray를 사용하여 새로 생성 된 NSArray 인스턴스를 반환하는 메서드가 있다고 가정 해 보겠습니다. 나는 종종Objective-C에서 반환 유형을주의 깊게 사용하고 계십니까?
- (NSArray *)someArray {
NSMutableArray *mutableArray = [[NSMutableArray new] autorelease];
// do stuff...
return mutableArray;
}
개인적 :
- (NSArray *)someArray {
NSMutableArray *mutableArray = [[NSMutableArray new] autorelease];
// do stuff...
return [NSArray arrayWithArray:mutableArray]; // .. or [[mutableArray copy] autorelease]
}
을 또는있는 NSMutableArray가있는 NSArray의 서브 클래스이기 때문에 그냥있는 그대로 가변 배열 객체를 떠나을 직접 반환 할 : 당신은 항상 같은 것을 할 마십시오 내가 "안전한"또는 더 "올바른"것 같은 기분이 들었 기 때문에이 메서드에서 반환 할 때 변경할 배열을 NSArray로 바꿉니다. 솔직히 말해서, NSArray에 캐스트 된 가변 배열을 반환하는 데 문제가 없었으므로 실제로는 문제가되지는 않을 것입니다. 그러나 이와 같은 상황에 가장 적합한 방법이 있습니까?
나는 일반적으로 동의합니다. 그러나 반환 된 값으로 호출 코드를 처리 할 수있는 가능성이 심각한 문제를 일으킬 수있는 경우 방어 복사가 좋습니다. 이것은 특히 프레임 워크 코드에 해당됩니다. –
호출 코드가 귀하의 API가 변하지 않는 것으로 처리되어야한다고 말하는 변이가 있다면, 그들은'-mutableCopy'를 수행해야합니다. 그렇지 않으면 잘못하고있는 것입니다. ;) (비록 당신이해야한다고 생각한다면 방어에서 당신을 막을 수 없다.) – Wevah
진짜 문제는, 나중에 변이 될 수있는 배열에 변경 가능한 배열 참조를 반환하면 NSArray *를받는 호출자가 내용이 절대로 바뀌지 않는다고 가정하고 ... 잘 ... * 붐 (BOOM). – bbum