2012-11-19 3 views
0

UILabel을 로컬로 만들고 subview으로 추가했습니다. 다음과 같은 문제가 발생합니다. 1) "Analyze"을 수행하면 컴파일러에 "incorrect decrement of the reference count of the object" 이 표시됩니다. 2) 보유 개수가 0이 아닌 것으로 확인됩니다. 나는 내 콘솔에서 다음을 얻을뷰 객체를 서브 뷰로 추가 한 후 뷰 객체를 해제하는 방법 : 메모리 누수 수정

-(UILabel*)createLabel:(CGRect)rect labelText:(NSString *)labelText { 
UILabel *label = [[UILabel alloc] initWithFrame:rect]; 
label.text = labelText; 
return label; 
} 
- (void)initMyView { 
UILabel *label = [self createLabel:rect labelText:circuitName]; 
NSLog(@"before using %d", [label retainCount]); 
[self.heatingCircuitsScrollView addSubview:label]; 
NSLog(@"before release %d", [label retainCount]); 
[label release]; 
NSLog(@"After release %d", [label retainCount]) 
} 

: 이 내 코드 1

내가 아는

출시 후 릴리스 2 전에 1 을 사용하기 전에를 그 "createlabel"에 오토 릴리즈를 사용하여 메서드는 문제를 해결합니다. 나는 접근 방식이 가장 좋고을 알고 싶습니다. 그리고 객체를 일단 Subview에 추가하면 그 객체를 해제하는 방법을 알고 싶습니다.

+0

답변 중 하나에 대한 의견이 없습니까? 질문이 있으면 분명히 할 수 있습니다. – ATaylor

답변

0

정적 분석기는 create...이라는 메서드에서 반환 된 개체를 릴리스하는 것으로 나타납니다. 따라서 반환 된 객체에 대한 소유 참조가 없다고 가정합니다. 당신의 방법 대신 newLabel...라고 한 경우 방법은 new (또는 alloc 또는 copy)로 시작하기 때문에

, 경고는 호출자가 해제 담당하는 객체를 생성하기 위해 가정, 멀리 갈 것입니다. 다른 모든 메서드는 자동 렌더링 된 객체를 반환한다고 가정합니다.

+0

필자는 'Analyze'가 함수 이름을 고려한다고 의심합니다. – ATaylor

+0

감사합니다. Yes _Analyze_는 함수 이름을 검사합니다. 그것은 올바른 방법. 경고를 삭제했습니다. 그러나 여전히 보유 수는 위에서 언급 한대로 1로 유지됩니다. 그게 누출 아닌가요? –

+0

보유 횟수는 문제가 아니므로 사용해서는 안됩니다. 뷰는 하위 뷰를 유지하므로 레이블을 유지해야합니다. 할당과 릴리스의 균형을 맞추거나 (또는 ​​ARC로 전환) – jrturton

0

기술적으로 이것은 다소 올바른 코드 여야합니다. 여기서 문제는 함수 호출에 달려있다. Analyze는 'release without alloc'을보고이를 알려줍니다.

'alloc'-> 'init'-> 'autorelease'를 사용해보세요. 그렇게하면 더 이상 사용하지 않는 순간 객체가 해제됩니다. 컴파일러에게 여전히 함수를 사용하고 있으며, 서브 뷰에 추가하는 것이 아니라면, 함수가 종료 될 때 함수가 끝난 후에 만 ​​정리할 것이라고 함수에 의해 반환됩니다.

하위보기 자체가 파괴되면 하위보기가 개체를 '해제'합니다.

는 긴 이야기를 짧게 만들려면 : ALLOC에

추가 오토 릴리즈 및 호출 방법에서 방출을 제거합니다. 그게 당신의 문제를 해결해야합니다.

+0

질문자는 이미 autorelease가 경고를 해결한다는 것을 알고 있습니다. 그들은 알고 싶습니다. _why_ – jrturton

+0

@jrturton 그리고 나는 그에게 왜 그 이유를 말했습니다. 함수 호출에는 릴리즈가없는 alloc이 있고 alloc이없는 릴리즈이기 때문에. – ATaylor

+0

@ATaylor 정보를 제공해 주셔서 감사합니다. 예, _autorelease_가 해결책이라고 생각합니다. 그러나 "분석"도구가 왜 그 오류를 던지는 논리적 인 방법을 알고 싶어하는지 궁금했습니다. –

관련 문제