9

이것은 이미 SO 내의 답변 질문이지만 어디서나 Apple 설명서 ()에서 찾을 수 없습니다. 저를 올바른 방향으로 가르쳐 주시겠습니까? 다음 항목 performSelector : withObject : 및 그 보유 행위

the effect on retain count of performSelector:withObject:afterDelay:inModes

Is object that calls performSelector:withObject:afterDelay get retained by the NSRunLoop?

기본 동작은 다음과 같은 것으로 보인다

Do I have to retain an object before passing it to -performSelector:withObject:afterDelay:?

: 는 수신기 및 인수 (들)을 유지합니다.

다음 코드 userData는 오토 릴리즈 oject입니다

[[self delegate] performSelector:@selector(tryToSendStoreData:) withObject:userData]; 

을 사용하고 있습니다.

전달 카운트 ()를 로깅하면 전달 된 데이터의 보유 횟수가 증가합니다 (). 대리자에서 메서드를 호출하면 보유 개수가 1이 아닙니다.

내 질문은 : 누출을 방지하기 위해 메모리 관리를 수행해야합니까, 아니면 Apple 제품을 신뢰해야합니까? 나는 올바른 문서를 찾을 수 없으므로 여기서 나는 불가지론 자라고 말하고있다.

미리 감사드립니다.

+0

보유 개수가 ARC에서 더 이상 정확하지 않습니다. – Dustin

+0

@Cake이 프로젝트에서 ARC를 사용하지 않습니다. 감사. –

+0

ARC가 활성화 된 프로젝트의 경우에는 다음을 살펴볼 수 있습니다. - http://stackoverflow.com/questions/7017281/performselector-may-cause-a-leak-because-its-selector-is-unknnn – rishi

답변

11

설명서에서 잘못된 기능을보고 있습니다.

(가) 이상

없음없이

performSelector:withObject:과 유사한 기능 (보유 실행하기 때문에, 수신기 및 인수를 보유 (afterDelay)

performSelector:withObject:afterDelay:과 유사한 기능을 보유afterDelay) 그들은 함수를 직접 호출하기 때문에 아무 것도 보유하지 않습니다. @newacct 올바른 대답을했다, 그러나 @Flex_Addicted이 요청했다는 질문, 즉 아니었다 동안

[[self delegate] performSelector:@selector(tryToSendStoreData:) withObject:userData]; 

[[self delegate] tryToSendStoreData:userData]; 
+0

+1. 그러나 나는 이것을 위해 어떤 문서도 찾을 수 없다. 또한 통화를 수행 한 후에 보유 수를 늘리는 이유는 무엇입니까? 고맙습니다. –

+0

@Flex_Addicted : 추가 안전을 위해 함수가 인수를 유지하고 자동 종료하는 것이 일반적입니다. 그래서 보유 개수를 보는 것은 쓸모가 없다. – newacct

+0

고마워. 그런 다음 문서가 있으면 링크하십시오. 건배. –

10

으로 똑같은 일을 애플의 문서 관찰 된 행동에서 인용 참으로 용기가있다.

performSelector:withObject:afterDelay:에 대한 문서는이 방법은 aSelector을 수행 할 수있는 타이머를 설정

한다고 - 아래는 (부분) 인용이지만, 우리는 거기에 도착하는 농구의 몇 가지를 통과해야합니다 현재 스레드의 실행 루프에있는 메시지

우리는 그래서 다음 NSRunLoop에 대한 문서를 향할 거기에 우리가 단 하나의 방법은 그 기능이 실행 루프에 물건을 대기열에 할 수있는 것을 발견 -
performSelector:target:argument:order:modes:, 그 문서 상태가

이 메서드는 다음 실행 루프 반복의 시작시 현재 스레드의 실행 루프에서 aSelector 메시지를 수행하도록 타이머를 설정합니다. 타이머는 modes 매개 변수로 지정된 모드로 실행되도록 구성됩니다. 수신자는 selector의 타이머가 시작될 때까지 target 및 anArgument 객체를 유지 한 다음 정리의 일부로 해제합니다. 물론

는 아무것도 [NSObject performSelector:withObject:afterDelay:] 항상 [NSRunLoop performSelector:target:argument:order:modes:] (누군가가 그것을위한 문서를 가지고 올 수 있다면이 답변이 완료 될지라도)를 사용하는 것을 보장 없지만, 적어도이 수수께끼 응답의 신비를 향한 단계입니다 거룩한 경전은 우리를 수수께끼로 만듭니다.