코드는 간단하다 :어떤 경우에 메모리 누수가 발생합니까?
@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?
어떻게 테스트 했습니까? 문자열 리터럴 값 ('@ "hello world"와 같은 것)을 가짐으로써? 문자열 리터럴을 사용하면 _never_가 릴리스되기 때문에 "테스트"가 끊어집니다. –
일반적으로 문자열 속성은 유지되는 대신 복사됩니다. 다른 사람이 변경할 수있는 유지 된 가치를 갖는 것이 당신이 원하는 것이 아닐 수도 있습니다. "필요한 것"에 대해 논할 수는 있지만 setter는 이전 값을 해제하고 새 값을 유지하거나 복사하는 등 속성에 대해 정의한 동작을 적용하기 때문에 사용하는 것이 좋습니다. setter 및 getter를 사용하면 KVO가 작동하는지 확인할 수도 있습니다. 변수를 변경하면 KVO가 작동하지 않습니다. –