NSArray 또는 NSDictionary를 반환하려면 대부분의 사람들이 아래 구현을 사용하는 것을 보았습니다. 이것은 또한 일부 책에서 제안한 것입니다. (아이폰 OS 개발 실용적인 접근 -)iOS 응용 프로그램에서 자동 레이아웃 객체 사용
OPTION
-(NSArray*)listOfStudents{
NSMutableArray *temp = [[NSMUtableArray alloc] init];
//Add elements to the array
//
//
//
NSArray *students = [NSArray arrayWithArray:temp];
return students;
}
-(void)viewWillAppear{
self.studentsList = [self listOfStudents];
}
그러나 일이 같은도 아래의 방법으로 할 수 있는가? 2
-(NSArray*)newListOfStudents{
NSMutableArray *temp = [[NSMUtableArray alloc] init];
NSArray *students = [[NSArray alloc]initWithArray:temp];
[temp release];
//Add elements to the array
//
//
//
return students;
}
-(void)viewWillAppear{
NSArray *array = [self newListOfStudents];
self.studentsList = array;
[array release];
}
OPTION 이러한 방법은 주 스레드 자체라고 가정하자.
메모리 사용량은 두 번째 옵션이 좋다고 생각합니다. autorelease가 풀릴 때만 풀어지기 때문에 autoreleased 오브젝트를 생성하지 않기 때문입니다.
메인 자동 실행 풀이 앱 종료시에만 드레인된다고 가정합니다. 그래서 OPTION 1의 메서드가 여러 번 사용되면 (ViewWillAppear에서 호출되기 때문에) 많은 목록이 응용 프로그램이 종료 될 때만 풀 릴리스되는 autorelease 풀에 있다고 생각합니다.
OPTION 2 접근 방식이 더 나은 접근 방식입니까?
업데이트 : 더 나은 명확성을 위해 viewWillAppear 구현을 업데이트 한
. 당신이 studentsList
이 retain
에드 속성이 있음을 경우
self.studentsList = [self newListOfStudents];
를 호출하는 의미
'NSMutableArray'는 NSArray의 서브 클래스이므로 첫 번째 코드 단편에서 단지'temp' 만 리턴하는 것이 아닙니다. 왜 불필요한 시간/메모리를 낭비 하는가? – trojanfoe
내부적으로 변경 될 수있는 내용이기 때문에 내용을 수정하는 데이 방법을 사용하는 사람들이 가능성을 열어 둘 수 있다고 생각했습니다. – Krishnan
그들은 NSMutableArray로 다시 캐스팅해야하지만, 이 메소드는 "나는 불변의 배열을 반환 할 것"이라고 말하고 객체를 잘못 사용하는 많은 방법이 있으므로 개인적으로 시스템을 중단하지 못하도록 막으려 고 노력하지 않습니다. – trojanfoe