2015-01-20 6 views
4

Xcode에서 Refactoring 도구를 사용하여 Modern Objective-C를 적용하는 작업을 수행합니다. 편집> 리팩터링> 현대 Objective-C 구문으로 변환합니다.NS_RETURNS_INNER_POINTER 플래그를 사용하는 방법

프로젝트에서 나는 const void * 유형의 메소드를 반환했습니다. 그리고 리팩토링 도구가 자동으로이 메서드 뒤에 NS_RETURNS_INNER_POINTER 플래그를 추가합니다. 나는 FoundationOlderNotes에있는이 깃발에 대해 확인했으나 나에게는 명확하지 않습니다.

  1. 비 객체 포인터 유형을 반환하는 메소드 또는 속성에 NS_RETURNS_INNER_POINTER을 추가해야합니까?
  2. 정확히 컴파일러는 ARC에서 메소드의 포인터 반환과 어떤 관계가 있습니까?

답변

2

NS_RETURNS_INNER_POINTERobjc_returns_inner_pointer 메소드 속성의 코코아 특정 등가물입니다. 워드 프로세서 here 같습니다

은 물체의 내부 데이터의 핸들을 리턴하는 을 나타낼 objc_returns_inner_pointer 속성 주석 수있다 비 보존 가능한 포인터를 리턴 오브젝티브 C 방법 및 그 본 객체가 파기 된 경우 참조가 무효화됩니다. 같은 메시지가 객체에 전송되면, 객체의 수명은 중 적어도 초기까지 확장 될 것입니다 :

  • 호출하는 함수에서 반환 된 포인터, 또는 그것에서 파생 된 포인터의 마지막 사용, 또는
  • autorelease 풀이 이전 상태로 복원됩니다.

이론적 근거

이론적 근거 : 모든 메모리와 리소스를 참조 카운트로 관리된다 객체가 개인적인 방법으로 개인 자원을 관리하는 것이 일반적입니다. 일반적으로 이러한 리소스는 개체 내에 완전히 캡슐화되지만 일부 클래스는 효율성을 위해 사용자에게 직접 액세스 권한을 제공합니다. ARC가 이러한 "내부"포인터를 반환하는 메서드를 인식하지 못하는 경우 해당 최적화로 인해 소유 객체가 너무 빨리 회수 될 수 있습니다. 이 속성은 ARC에게 가볍게 트레드해야 함을 알립니다.

확장 규칙은 다소 모호합니다. autorelease pool limit는 간단한 구현으로 수신기를 유지하고 자동 해제하는 것을 허용합니다. 다른 한도는 어느 정도의 최적화를 허용합니다. "파생 된"이라는 문구는 형 변환 및 산술과 같은 포인터 변환과 그러한 파생 포인터에서로드하는 결과를 모두 포함합니다. 또한 이러한 파생어가 호출 코드 나 다른 유틸리티 코드 (예 : C 라이브러리 루틴 strchr)에 직접 적용되는지 여부를 적용합니다. 그러나 구현은 내부 포인터를 반환하는 메서드를 호출하는 코드에서 반환 한 후에는 사용을 고려하지 않아도됩니다. 수신기 precise lifetime semantics__strong 대상물로부터 직접로드 된 경우는 예외로서

은 확장자가 필요하지 않다.

이론적 근거

암시 autoreleases 크게 팽창 메모리 사용의 위험을 가지고, 그래서 사용자에게 이러한 autoreleases을 피할 수있는 방법을 제공하는 것이 중요합니다. 이를 정확한 평생의 의미로 묶는 것이 이상적입니다. 지역 변수의 경우 매우 명시적인 주석이 필요합니다. 그러면 ARC가 사용자를 잘 응합니다.

는 특정 질문에 대답하려면 :

  1. 이 아니, NS_RETURNS_INNER_POINTER로 주석 할 수있는 비 객체 포인터를 반환 모든 메서드 또는 속성에 대한 필요가 없습니다. "내부"또는 "내부"포인터를 반환하는 경우에만 수행해야합니다. 즉, 객체 자체가 할당 해제되면 포인터가 무효가됩니다.
  2. 정확하게 컴파일러가 지정하지 않는 것은 지정되지 않습니다. 구현에 따라서는 내부 포인터를 반환 한 객체를 단순히 보유하고 자동 해제 할 수 있습니다.
관련 문제