2012-06-10 5 views
0

코드는 간단하다 :어떤 경우에 메모리 누수가 발생합니까?

@interface Test : NSObject 
@property (nonatomic, strong) NSString * str; //strong 
//@property (nonatomic, weak) NSString * str; //weak 
-(void)func; 
@end 

@implementation Test 
@synthesize str = _str; 
-(void)func{ 
    _str = @"test string";  // using ivar 
    //self.str = @"test string"; // using setter 
} 
@end 

four 상황 강한/약한 바르/세터, 위의 코드가 메모리 누수의 원인이됩니다 유형

?

어떤 유형이 같은가요?

NSLog로 코드를 테스트했지만 모두 정상적으로 실행되었습니다 (인쇄되지 않음). 이유가 무엇입니까? 대략 autorelease일까요?

-------------- 편집 ---------------

나는 문서를 읽고 문자열 상수가 될 것 "것을 발견

문자열 initWithString 또는 initWithFormat으로 초기화 할 때 그래서 코드의 행위를 다른

약한 속성이 항상 메모리 관리 바르 위해

initWithFormat 사용하는 경우 전무하고 (그리고 내가 쓴 코드하는 것은 잘못된 것입니다) "해제하지 세터는 동일합니다 : Is self.iVar necessary for strong properties with ARC?

+0

어떻게 테스트 했습니까? 문자열 리터럴 값 ('@ "hello world"와 같은 것)을 가짐으로써? 문자열 리터럴을 사용하면 _never_가 릴리스되기 때문에 "테스트"가 끊어집니다. –

+1

일반적으로 문자열 속성은 유지되는 대신 복사됩니다. 다른 사람이 변경할 수있는 유지 된 가치를 갖는 것이 당신이 원하는 것이 아닐 수도 있습니다. "필요한 것"에 대해 논할 수는 있지만 setter는 이전 값을 해제하고 새 값을 유지하거나 복사하는 등 속성에 대해 정의한 동작을 적용하기 때문에 사용하는 것이 좋습니다. setter 및 getter를 사용하면 KVO가 작동하는지 확인할 수도 있습니다. 변수를 변경하면 KVO가 작동하지 않습니다. –

답변

0

ARC를 사용하는 경우 시스템이 메모리를 처리하고 누출로보고하지 않습니다. 다음은 ARC와 강점과 약점 참조의 차이점에 대해 알아 보는 좋은 글입니다.

http://www.quora.com/Objective-C-programming-language/In-Objective-C-whats-the-difference-between-a-strong-and-weak-pointer

+0

필자는이 글을 읽었을 때,'weak'가 틀린 방식이어야한다는 것을 알았습니다. 객체는 더 일찍 공개 될 것입니다. 그러나'_str'이'strong' case의'self.str'와 같은 경우? – kran

0

나는 항상 그러나 나는 약한 클래스가 전무로 설정 될 때 강한 반면, VAR도 될 때까지 클래스가 사라 못하게 멀리 갈 것을 의미 기본적 생각도이 이상 혼란스러워 +1 보유 횟수가 시작됨에 따라 삭제되었습니다.

누출의 원인을 묻지는 않습니다. 제대로 사용될 때와 둘 다 올바르게 사용할 수 없으므로 누출이 발생하지 않습니다.

관련 문제