2012-12-13 1 views
3

ARC를 사용하는 경우 performSelector:을 사용하여 다음 방법을 호출하려면 어떻게해야합니까? 나는 다음과 같은 것을 사용하는 경우performSelector : 안전하게 할당 된 객체를 반환하는 메서드를 사용

- (SomeClass *)test { 
    return [[SomeClass alloc] init]; 
} 

, 나는 선택이 프로그램 생성되기 때문에 ARC는 무엇을 해야할지하지 않기 때문에 내가 누수를 소개 수도 경고를 얻을.

[object performSelector:selector]; 
+0

이 방법은 실제로 누출되지 않습니다. 명명 규칙 때문에 컴파일러는 반환 된 객체를 자동으로 자동 렌더링합니다 (ARC 아래). –

+0

@KevinBallard, 컴파일러에서 선택기 이름을 알 수 없더라도? – rid

+0

예. 함수의 메모리 동작은 함수 자체에 의해 정의됩니다. 경고는 ARC가'-performSelector :'의 반환 값이 + 1 또는 +0 객체인지 알 수 없다는 것을 알려줍니다. 소유하지 않은 객체 (+0 객체)를 반환하는 메소드를 호출하는 경우 누수가 없습니다. 그러나 소유 된 객체 (+1 객체)를 반환하는 메서드를 호출하면'-performSelector :'에 대한 호출이 누출됩니다. –

답변

2

이 특별한 경우에는 괜찮습니다. 이 경고는 컴파일러가 -performSelector:이 +0 또는 +1 객체를 반환 할 것인지 여부를 알 수 없다는 것을 알려주며 컴파일러는 +0 객체라고 가정합니다. 그래서 누설 여부는 실제 호출되는 메소드에 달려 있습니다. 이 경우 메서드는 -test이며 명명 규칙에 따라 +0 개체가 반환됩니다. 따라서이 방법을 -performSelector:으로 호출하면 누설이 발생하지 않습니다.

+0

그래서 만약 메소드가'-initTest'라고 이름 지워지거나 메소드가 정적이고'+ allocTest'라고 불리는 경우에만 문제가 발생합니까? – rid

+0

@rid : 또는'+ newTest' 또는'-copy' 또는'-mutableCopy'. 또는 속성을 사용하여 보존 된 객체를 반환하는 것으로 주석을 달았습니다 (예 : '__attribute __ ((ns_returns_retained))'. 그 경우가 아니라고 가정하면 메서드는 +0 객체를 반환합니다. –

관련 문제