2009-07-25 4 views
2

저는 iPhone SDK 3.0을 사용하고 있습니다. 그러나 이것은 메모리 관리와 함께 일하는 방법에 대한 일반적인 오해라고 생각합니다. &포인터 메모리 관리 오해 오브 객의 -c

나는이

@implementation MyViewController 
- (void)viewWillAppear:(BOOL)animated { 
    NSArray *items = [NSArray arrayWithOjbects:self.searchButton, self.trashCan, nil]; 
    [self.bottomBar setItems:items animated:YES]; 
} 
// other stuff... 
@end 

난 도망 위의 뷰 컨트롤러에서 전환하고 모든 것을 다시 전환하려고 같은 viewWillAppear 메소드가 제대로 작동 무시했습니다.

그러나 내가 이라고 생각하면 NSArray에 대한 참조가 이제 bottomBar에 의해 유지되기 때문에 원래의 포인터를 "항목"에 "놓아야합니다". 하지만이 (아래 코드 참조) 및 UIViewController 멀리 전환하려고 할 때 메모리 관리 오류 (- [CFArray 개수] : 해제 된 인스턴스 0xd5f530 메시지를 보냈습니다).

- (void)viewWillAppear:(BOOL)animated { 
    NSArray *items = [NSArray arrayWithOjbects:self.searchButton, self.trashCan, nil]; 
    [self.bottomBar setItems:items animated:YES]; 
    [items release]; 
} 

내가이 경우 하지 릴리스 항목에 필요합니까? 아니면 내가 잘못하고있는거야? 분명히, 경험적 증거에 의하면 "항목"을 공개해서는 안되지만, 이것이 왜 그런지는 분명하지 않습니다.

정보/"포인터"를 보내 주셔서 감사합니다!

+0

덕분에! 그리고 링크에 감사드립니다. – user141146

답변

3

초기화하지 않았으므로 놓을 필요가 없습니다. [NSArray arrayWithObjects:...]은 자동 렌더링 된 객체를 반환합니다. 메서드에서 반환 될 때 autorelease 메시지가 전송되었으므로 릴리스 할 책임이 없습니다. 당신은 당신이 초기화 한 것을 릴리스해야합니다! (당신이 사용했다면 [[NSArray alloc] initWithObjects:...] 당신은했을 것이다.)

+1

당신이 그것을 풀어 놓을 책임은 없지만, 자동 회수 된 객체라는 보장은 없습니다. 당신이 아는 전부는 당신이 소유하고 있지 않다는 것입니다. 에서 규칙을 읽으십시오. –

0

arrayWithObjects:NSArray에 전화 할 때 : 당신은 오토 릴리즈 배열을 반환

NSArray *items = [NSArray arrayWithObjects:self.searchButton, self.trashCan, nil]; 

. 어레이는 alloc, new 또는 copy이 포함 된 메소드를 호출하지 않으므로 자동 응답 된 것으로 반환됩니다. 이는 해당 객체를 메모리 관리 할 필요가 없음을 나타냅니다.

그러나, 다음의 1까지 카운트 유지 해주, 인수로 배열을 전달, self.bottomBarsetItems를 호출 할 때 유지됩니다 (자세한 내용은 Memory Management Programming Guide for Cocoa 살펴보십시오), 그러나 당신은 반환을 해제 그 보유 수는 제로로 되돌아 가고, 그 결과 할당이 해제된다.

배열은 self.bottomBar으로 유지되므로 배열의 메모리를 관리하고 있음을 의미합니다. 더 이상 필요하지 않으면 클래스가 더 이상 메모리를 관리하는 올바른 방법 인 배열을 필요로하지 않는다는 것을 의미하는 배열이 해제됩니다.

+ :

+0

당신이 그것을 풀어 놓을 책임은 없지만, 자동 회수 된 객체라는 보장은 없습니다. 당신이 아는 전부는 당신이 소유하고 있지 않다는 것입니다.

0

는 여기에 짧은 버전의 [NSArray를의 arrayWithObjects :] 당신이 그렇게 아니, 당신이 그것을 해제하지 말아야 소유하지 않은 개체를 반환합니다. 당신이했던 경우 반면에

는 :

NSArray *items = [[NSArray alloc] initWithObjects:self.searchButton, self.trashCan, nil]; 

이 하나의 유지 수를 가진 객체를 생성, 그래서 당신은 누출을 방지하기 위해이를 해제해야합니다.

자세한 내용은 Memory Management Programming Guide for Cocoa을 확인하십시오.

+0

에서 규칙을 읽으십시오. 귀하가 그것을 풀어 주실 책임은 없지만, 귀하는 자동 회수 된 사실이 없습니다. 목적. 당신이 아는 전부는 당신이 소유하고 있지 않다는 것입니다.

+0

에서 규칙을 읽으십시오. 저는이 차이점을 알고 있습니다, 감사합니다. 나는 Objective-C의 초보자가 이해할 수있는 방식으로 설명하려고 노력했다. 따라서이 주제를 깊이 배우고 싶다면 나와 똑같은 문서에 연결했다. –

+0

나는 당신이이 방법으로 실패한 답 중 최고라고 동의합니다. 그러나 구별을 알고 있다면 초보자에게 혼란을주지 마십시오. 일단 자동 렌더링 된 객체에 대해 이야기를 시작하면, 거기에서부터 셀 수와 그 모든 언덕을 생각하기 시작합니다. 메모리 관리 규칙은 간단하고 이해하기 쉽고 autorelease 나 카운트를 유지하는 것에 대해 아무 말도하지 않습니다.하지만 초보자는 종종 이러한 것들에 관해 이야기를하기 때문에 종종 혼란스러워합니다. –

0

천국인을 위해 Memory Management Rules을 가리 키기 만하면됩니다. 그들을 바꾸지 마십시오. "자동 렌더링 된 객체를 반환합니다"라고 말하지 마십시오 (반드시 사실 일 필요는 없으며 사실 일 때도 무방합니다). 규칙을 지적하십시오.

규칙은 총 9 개 문단입니다! 의역을 바꾸거나, 절제하거나, 다시 말 할 필요가 없습니다. 그들은 명확하고 간결하고 명백합니다.

규칙을 읽고 규칙을 따르면 메모리 관리 문제가 없습니다.