2014-11-22 4 views
-1

를 공개하지 않는 이유는 같은 일부 코드가 있습니다반환 값이

- (SendFileInfo *)sendFileInfoForName:(NSString *)name { 
    for (SendFileInfo *sendFileInfo in sendArray) 
    { 
     if ([sendFileInfo.name isEqualToString:name]) 
     { 
      return sendFileInfo; 
     } 
    } 
    return nil; 
} 

그래서이 방법의 반환 값은 SendFileInfo의/해제를 보유 이벤트를 추적 할 수 autorelease.I 사용 도구가 될 것입니다 때로는 SendFileInfo 것 다음과 같이 자동 출시 후 출시 :

Retain/Autorelease/Release (3) 00:48.146.622 ipjsua -[SendFileQueue sendFileInfoForName:] 

Retain +1 5 00:48.146.622 ipjsua -[SendFileQueue sendFileInfoForName:] 

Autorelease   00:48.146.627 ipjsua -[SendMessageViewController refreshSendFileView:] 

Release -1 4 00:48.155.558 GraphicsServices GSEventRunModal 

가끔씩 출시 조치가 없으므로이 개체의 메모리가 해제되지 않습니다. 결국

Retain/Autorelease (2) +1  00:46.996.752 ipjsua -[SendFileQueue sendFileInfoForName:] 

Retain +1 2 00:46.996.752 ipjsua -[SendFileQueue sendFileInfoForName:] 

Autorelease   00:46.996.756 ipjsua -[SendMessageViewController refreshSendFileView:] 

는 SendFileInfo 오브젝트의 레퍼런스 카운트 (오토 릴리즈 후 해제하지 않음) sendFileInfoForName 메소드가 호출 될 때와 동일하다. 메모리 누수! 릴리스 이벤트는 언제 발생합니까? 릴리스 이벤트가 같은 방법으로 발생하지 않는 이유는 무엇입니까?

+0

반환하는 객체는 컨테이너 객체가 보유하고있는 것으로 알려져 있으므로 해당 코드가 추가로 보유하지 않아도됩니다. 위의 추적 정보를 실제로 보면 두 번째 경우에 위의 코드 외부에있는 GraphicsServices의 릴리스가 누락 된 것을 볼 수 있습니다. –

+0

(저는 GraphicsServices에 익숙하지 않지만 어떻게 든 이벤트 핸들러를 사용하거나 문제 객체를 "데이터"값으로 사용할 수 있습니다.) 해당 이벤트 핸들러가 트리거되지 않았거나 취소 된 경우 객체가 유지됩니다. –

답변

2

개체가 더 이상 참조되지 않을 때 개체가 릴리스됩니다. 그러나 반환하는 객체는 여전히 배열 sendArray에 의해 강력하게 유지됩니다. 그 컬렉션을 떠나 자마자, 그것은 공개 될 것입니다.

모든 유형의 컬렉션, NSArrays, NSSets 및 NSDictionaries는 추가하는 객체를 강력하게 참조합니다. 즉, 배열의 수명 기간 동안 "활성화"됩니다.

+0

나는 그것을 알고 있습니다. 그리고 나는 그 물건이 이미 그 수집 물에서 제거되었다는 것을 확신합니다. 이 이벤트 -> (Release -1 4 00 : 48.155.558 GraphicsServices GSEventRunModal)은 콜렉션에서 객체가 제거되기 전에 발생했습니다. 왜 이런 일이 발생하지 않는지 알 수 없습니다. 그리고 메모리 누수가 발생합니다. – Cotin

+1

이 대답의 첫 번째 문장은 올바르지 않습니다. 객체에 대한 참조가 더 이상 없을 때 객체는 해제 (해제되지 않음)됩니다. – rmaddy