2011-11-19 2 views
0

나는 여전히 iphone 메모리 관리에 관한 나의 머리를 감싸고있다. 나는 이것을 누출과 함께 점검했지만 확실하게하고 싶다. 이것은 누수가 없습니까?iphone 메모리 관리 및 배열

NSMutableArray *array = [[NSMUtableArray alloc] init]; 
NSMutableString *str = [[NSMutableString alloc]]; 

[str appendstring:@"hi"]; 

[array addObject:str]; 

[str release]; //this is the bit I am most concerned about 


...some processing of array occurs... 

[array release]; 
+0

누수가 없어야 수 있지만, '아무튼 t 컴파일. :) –

+1

2 행에'init'이 누락 되었습니까? 어쨌든 누출이없는 것 같습니다. – Ryan

+0

이 주제에 관한 나의 저서는 무료 온라인 : http://www.apeth.com/iOSBook/ch12.html#_memory_management (ARC를 고려하여 재 작성 됨) – matt

답변

4

실제로이 두 번째 라인입니다 가정 :

NSMutableString *str = [[NSMutableString alloc] init]; 

이 그런 예,이 누수 무료입니다. 문자열을 배열에 추가 할 때 배열은 문자열에 대한 소유권을 가져 오므로 후속 명령문 인 release의 소유권이 문제가되지 않습니다. 예상대로 어레이에 여전히 존재합니다.

배열을 놓을 때 사용자가 입력 한 문자열을 가리키는 참조를 포함하여 자체 참조를 정리합니다.

1

엄지 손가락의 규칙, 당신은 스티커 메모에 쓰기 당신의 책상 위에 달라 붙어

경우 ALLOC, 새, 초기화 또는 당신은 당신이 가지고있는 소유자 :

보다 복사 그것을 풀어 라! 아무도 당신을 위해 정리하지 않습니다.

** 예 :

NSString *releaseMeLaterPlease = [NSString initWithString....]; 

일부 배열은 "가방"가정 등의 예에서와 같이 다른 방법을 작성하는 경우,

지금
NSString *dontReleaseMe = [bag objectAtIndex:0]; 

, dontReleaseMe가 생성되지 alloc, new, init 또는 copy에 의해 해제 할 수 있습니다. 어떤 사람들은 그것을 할 것입니다.


alloc 및 init보다 autorelease를 사용하면 OS가이를 해제합니다.


가장 중요한 : 이제 개발자는이 물건에 대해 걱정할 필요가 없습니다! Hoooooray! 자동 참조 횟수는 같은 모든 장치를 배울 수 iOS5를 :)

행운을 빕니다 좋은했다입니다 그러나 iOS5를

에서입니다!

0

quixoto는 질문에 대답, 그러나 다만 명시 적 존재의 이익을 위해, 여기에 무엇을 각 줄에 코드에서 메모리 관리와 관련하여 일어나고있다 :,

NSMutableArray *array = [[NSMUtableArray alloc] init]; //array retain count = 1 
NSMutableString *str = [[NSMutableString alloc]]; //str retain count = 1 

[str appendstring:@"hi"]; 

[array addObject:str]; //str retain count = 2 

[str release]; //str retain count = 1 

...some processing of array occurs... 

[array release]; //array retain count = 0 & str retain count = 0 .. objects will be removed from memory.