2012-01-08 1 views
8

xcode 4.2에서 샘플 프로젝트를 만들고 새로운 프로젝트가 ARC로 설정되었음을 알았습니다.ARC 메소드 모범 사례에서 객체 반환하기 (메모리 누수 경고 받기)

다음과 같은 방법이 있습니다. 이전에는 메서드에서 셀을 자동으로 가져와 호출자의 테이블 뷰에서 셀을 유지하도록했습니다. ARC와 함께, autoreleasing이

- (UITableViewCell*) getCellForIndex:(int)index { 

    UITableViewCell *cell =   
     [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]; 

    if (index == 0) 
     cell.textLabel.text = profileToUse.name; 
    if (index == 1) 
     cell.textLabel.text = profileToUse.sex; 
    if (index == 2) 
     cell.textLabel.text = profileToUse.city; 
    return cell; 
} 

내가 위의 코드에 대한 분석 도구를 실행하는 경우, 가능하지 않을 것, 그것은 대상 '셀'의 메모리 누수의 가능성이 있음을 말한다.

분석 경고가 사라지도록하려면 위의 내용을 어떻게 ARC를 사용하여 작성해야합니까? 내가 도대체 ​​뭘 잘못하고있는 겁니까?

감사합니다.

답변

4

귀하의 방법 getCellForIndex: 할당하고,이 방법으로는 직선 alloc (실제로 코드와 유사하다는 것입니다 초기화가있는 alloc).

ARC는 호출 할 때 메소드의 실제 구현을 보지 못하므로 리턴 된 객체의 소유권에 대한 가정을해야하며, 소유권이 이 아니고이 전송됨을 전제로합니다. 구현을 컴파일 할 때 ARC는 코드가이 가정을 위반하고 경고한다는 것을 알게됩니다.

가정

은 당신의 방법에 명시 적 속성을 추가하여 대체 할 수 있습니다 모두 @interface@implementation :

- (UITableViewCell*) getCellForIndex:(int)index __attribute((ns_returns_retained)) 

ARC는 이제 오브젝트 소유권 전송을 알 수 있습니다. alloc, new 등의 메소드에는이 속성이 자동으로 추가됩니다. 귀하의 방법을 바꾸는 것이 더 나을 것이라고 다른 답변에서 제안하는 경우, 및 init의 조합에 new이 사용되므로 여기에서 newCellForIndex:이 적합 할 수 있습니다.

BTW : S '의 else if에의'의 두 번째 & 세 번째 if을 변경하면 알고리즘이 명확하게 (약간 빠르게,하지만 그것을 할 이유가없는) 것입니다. 코멘트에서

질문 :

ARC 등 새 속성을 소개 않지만 너무 자주 그들을 필요가 없습니다 당신은 일반적인 코코아 규칙을 따른다면 있도록 또한 추론 및 기본값을 사용 - YMMV 물론 .. Apple의 문서 외에도 here 설명을 찾을 수 있습니다.

+0

이 예제는 가지고있는 cellcreator 클래스의 단순화 된 버전입니다. 동적으로 다른 셀 유형 (레이블 + tetfield, label + label (datepicker 호출 용))을 추가해야하고 한 장소에서 여러 클래스에서이 작업을 수행해야합니다. –

+0

와우! 따라서 ARC를 사용하려면 완전히 새로운 속성 및 태그 집합에 대해 알아야하며 선언을 통해 사용자의 의도에 명시해야합니다. 수동으로 메모리를 관리하는 것과 비교하여 실제로 개발 속도가 빨라 집니까?이 속성 목록이 있습니까? –

+0

나는 속성을 주석 처리하고 메소드 'newCellAtIndex'의 이름을 변경했으며 심지어 경고를 없앴습니다. 따라서 이름을 지정하면이를 수정할 수도 있습니다. –

5

메소드의 이름을 -cellForIndex :, "get"으로 변경하십시오. -prefixed 메소드는 Cocoa에서 암시적인 동작이 다릅니다.

(또는, 어쩌면 -cellAtIndex : 등 NSArray를, 일관성 ...에 대한) 개체를 반환

+3

특히 "get"접두사가 붙은 메서드는 포인터 인수를 사용하여 참조로 값을 반환해야합니다. NSArray의'- (void) getObjects : (id *) aBuffer range : (NSRange) aRange'를 예로 들어 보겠습니다. 나는 이것이 실제로 경고를 일으키는 지 잘 모르겠다. 적어도 나는 그것을 재현 할 수 없다 ... –

+0

Yup. ARC는 귀하의 방법이 코코아 규칙을 따른 경우에만 작동 할 수 있습니다. – StilesCrisis

+0

catfist_man.CRD의 메소드 이름 제안 인 'newCellAtIndex'를 사용한 후 경고 메시지가 사라졌습니다. 그래서 네가 정신에 옳았다. 그냥 'cellAtIndex'라는 이름을 지정해도 경고가 사라지지 않았습니다. 감사!!! –