2012-10-04 5 views
0

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 구현을 업데이트 한

. 당신이 studentsListretain 에드 속성이 있음을 경우

self.studentsList = [self newListOfStudents]; 

를 호출하는 의미

+1

'NSMutableArray'는 NSArray의 서브 클래스이므로 첫 번째 코드 단편에서 단지'temp' 만 리턴하는 것이 아닙니다. 왜 불필요한 시간/메모리를 낭비 하는가? – trojanfoe

+0

내부적으로 변경 될 수있는 내용이기 때문에 내용을 수정하는 데이 방법을 사용하는 사람들이 가능성을 열어 둘 수 있다고 생각했습니다. – Krishnan

+0

그들은 NSMutableArray로 다시 캐스팅해야하지만, 이 메소드는 "나는 불변의 배열을 반환 할 것"이라고 말하고 객체를 잘못 사용하는 많은 방법이 있으므로 개인적으로 시스템을 중단하지 못하도록 막으려 고 노력하지 않습니다. – trojanfoe

답변

2

내가 두 번째 예에서는 생각 이 지금 누출 것이다.

또한 두 예제의 임시 배열은 쓸모없는 오버 헤드입니다. 두 번째 예에서는 단순한 말도 안됩니다.

1) 메모리 문제를 가리 킵니다 코드를 통해 정적 분석기를 실행 수 있습니다

깨끗한 솔루션은

-(NSArray *)listOfStudents { 
    NSMutableArray *list = [NSMutableArray array]; 
    // Add things to array 
    return list; 
} 

두 더 조언이다.
2) 메모리 관리에 대한 확신이 있다면 ARC로 전환하십시오.

+0

나는 그것을 정확하게 의미하지는 않았다. 나는 그 질문을 업데이트했다. – Krishnan

+0

새로운 옵션이나 자동 출시 버전 중 어느 옵션이 더 좋을지 알아야합니다. – Krishnan

+0

정말 중요하지 않습니다. "새로운"접근 방법은 언제 출시 될지 더 잘 제어 할 수 있지만 거의 문제가되지 않습니다. 일반적으로 자동 출시 버전이 가장 일반적인 패턴입니다. ARC를 충분히 추천 할 수는 없지만 코드가 간단 해지고 성능이 향상되는 경우가 많습니다. – Eiko

관련 문제