2012-01-07 1 views
3

저는 (특히 iPhone에서) iOS 개발에 익숙하지 않은 숙련 된 개발자입니다. 내가 일하고있는 프로젝트는 ARC (Automatic Reference Counting)를 사용하고 있습니다.iOS 용 objective-c/cocoa에는 어떤 메소드 패밀리가 있습니까?

나는 ARC에 대한 조사를하고 있었고이 문서를 보았습니다 : http://clang.llvm.org/docs/AutomaticReferenceCounting.html 및 "Retained return values"라는 제목의 섹션에서 속성을 사용하여 발신자가 +1의 소유권을 얻으려는 것을 나타낼 수 있음을 나타냅니다 카운트 유지. 또한 ARC가 특정 메소드 패밀리 (구체적으로 : alloc, copy, init, mutableCopy 및 new)에 있음을 감지하면 ARC가 메소드에 속성을 자동으로 추가 함을 설명합니다.

추가 읽기에서부터 메서드 패밀리는 단순히 메서드 명명 규칙입니다. 나의 이해는 메소드 이름이 메소드 패밀리로 시작하면 그 메소드 패밀리에있다. 따라서 예를 들어

+(id) init 
+(id) initWithName:(NSString*)name 

은 init 메소드 패밀리의 일부입니다.

내 질문에 : iOS 개발을 위해 정의 된 Method Families 목록이 있습니까? 그렇다면 어디에서 찾을 수 있습니까?

3.2.2 : 아래

제가 위에서 언급 한 부분 llvm.org 인 보존 리턴 값 상태 :

가 표시 될 수있는 보존 가능한 오브젝트 포인터 타입을 반환하는 함수 또는 방법 보유자는 발신자가 +1 보유 수의 소유권을 가져야 함을 나타냅니다. 이 때문에 같은 기능 또는 방법 선언에 ns_returns_retained 속성을 추가함으로써 행해진 다 :

foo를 ID (공극) __attribute ((ns_returns_retained)); - (id) foo __attribute ((ns_returns_retained)); 이 특성은 함수 또는 메서드 형식의 일부입니다.

이러한 함수 또는 메서드에서 복귀 할 때 ARC는 모든 로컬 범위를 떠나기 전에 return 문을 평가할 때 값을 유지합니다.

이러한 함수 또는 메서드에서 반환 된 결과를 받으면 ARC 은 로컬 값에 대한 일반적인 최적화가 적용되는 경우 내에 포함 된 전체 식의 끝에서 값을 해제합니다.

이론적 설명 : 이는 호 출자 에서 발신자에게 소유권을 직접 전송하는 것을 공식화합니다. 이 모델에서 가장 공통적 인 시나리오는 init, alloc, new 및 copy 메소드에서 반환 된 이지만 프레임 워크에 다른 사례가 있습니다. 최적화 후 일반적으로 추가 보유 및 릴리스가 필요하지 않습니다.

ALLOC를, 복사, 초기화, mutableCopy의 메소드, 새로운 가족이 암시 속성을 표시됩니다 ((ns_returns_retained)). 이것은 속성 ((ns_returns_not_retained))을 명시 적으로 표시하여 일 수 있습니다.

Objective-C 메시지 ()가 정적으로 해석을 보내는 메소드가 그 결과에 대해 보유 의미론이 다른 경우 이 동적으로 해석되는 방법에서 정의되지 않은 동작입니다. 호출 된 블록 또는 함수의 구현에서 결과에 대한 보유 의미가 인 정적 유형을 통해 블록 또는 함수 호출이 수행되는 경우 정의되지 않은 동작입니다.

근거 : 결과에 따라 불일치가 발생하면 방향에 따라 초과 보유 또는 초과 출시가 발생합니다. 다시 말하지만, 함수 호출에 대한 규칙은 실제로 호환되지 않는 함수 유형을 통해 함수를 호출하는 것에 대한 기존 C/C++ 규칙의 응용 프로그램에 불과합니다.

+1

이러한 명명 규칙 모음은 iOS가 아니라 Objective-C ARC (특히 iOS 및 OS X는 현재 알고있는 유일한 사용자)입니다. – bshirley

답변

5

공식적인 방법 목록을 본 적이 있는지 모르겠지만 분석은 기본적으로 정확합니다. 나는 컴파일러가 시행 한 의미를 갖는 유일한 명명법은 alloc, init, copy (와 mutableCopy), 그리고 new와 같은 게시물에 언급 된 것들만 믿는다. ARC 이전/이후에도 Xcode에 포함 된 clang 정적 분석기는 메모리 관리 문제를 찾기 위해 이러한 명명 규칙을 사용하며 ARC 이전의 Objective-C 프로그래머를위한 오랜 메모리 관리 규칙의 기초이기도합니다.

즉 init, copy, mutableCopy 또는 new로 시작하는 메서드를 사용하여 개체를 만드는 경우 해당 개체를 "소유"하며 나중에 해제해야합니다. 다른 이름의 메소드로 작성되거나 리턴 된 오브젝트는 이 아니며 호출자 인이 아니며 참조를 유지하려면이를 보유해야합니다. 객체 참조가 끝나면 나중 릴리스에서 균형을 유지해야합니다. 마지막으로 객체에서 autorelease를 호출하면 가장 안쪽의 자동 릴리스 풀에 놓입니다. 풀은 객체를 나중에 릴리스하는 역할을 담당하며, 나중에 현재의 스코프를 언젠가는 나중에합니다. 따라서 릴리스와 자동 회수는 둘 다 객체에 대한 소유권을 포기하는 유효한 방법입니다.

자, ARC에서 프로그래머 인 당신이 따라야 할 규칙이 있습니다. 그러나 ARC는 기본적으로 정적 분석기의 도움을 받아 컴파일러가 이러한 규칙을 알고 컴파일시 필요한 메모리 관리 호출을 삽입하는 시스템입니다. 따라서 ARC가 막후에서 무엇을하는지 이해하려고 할 때 이러한 규칙을 이해하는 것이 좋은 출발입니다.

이것은 약간 오래 지났지 만, 요점은 Objective-C에서 시행 된 명명 규칙을 가지고있는 유일한 방법이라는 점입니다.이 규칙은 앞에서 설명한 메모리 관리 규칙에서 유래합니다 위. Objective-C에는 다른 명명 규칙이 있지만 확실한 것은 표준 스타일 규칙이므로 아무 곳에서나 적용됩니다.

3

Memory Management Rules에 대한 공식 Apple 개발자 문서를보십시오. "alloc", "new", "copy"또는 "mutableCopy"(4 개의 키워드 만) 목록이 완성 된 것 같습니다.

9

Section 5 of the same document의 제목은 "방법 패밀리"입니다. 위에서 정의한 모든 현재 정의 된 패밀리를 나열합니다. alloc, new, copy, mutableCopyinit. 또한 그 가족의 일원이되는 기준을 열거합니다. 주로 메서드 이름을 기반으로하지만 반환 형식에 따라 다릅니다. 예를 들어 copy 패밀리의 멤버는 객체를 반환해야합니다. void 반환 유형이있는 복사 메서드는 copy 메서드 패밀리의 일부로 간주되지 않습니다.

+0

예, 해당 부분은 에서 위의 목록이 떠올랐다. 명명 규칙은 객관적인 -c/코코아에 중요하다는 것을 알고 있지만 컴파일러가 명명 규칙에 영향을 받는다는 것에 약간 놀랐습니다. 나는 내 함수에 이름을 붙이는 방식 때문에 다른 컴파일러 최적화가 무엇이 될지 염려 스럽다. ARC 문서에 제시된 목록이 해당 언어의 전체 목록인지 아니면 ARC를 위해 작동하는지 여부는 확실하지 않았습니다. – jminadeo

+0

반환 유형이 가족 구성원 자격의 일부 였음을 알지 못했습니다. 감사합니다. – jminadeo

0

좀 코코아 클래스에서 제공하는 편의 생성자 포함됩니다 : 그들은 모두가 전송됩니다 클래스의 새로운 오토 릴리즈 인스턴스를 반환

- +stringWith*      // Various ways to make NSString objects 
- +arrayWith*, +dictionaryWith*, etc. // Make collections 
- +dateWith*       // Make NSDate objects 
- etc.        // Many, many others 

- 특별한 경우를 제외하고를, 예를 들어 참조 @ 피터 호세의 의견.

공식적인 규칙이 있는지 모르겠지만, 패턴이 생성자 이름을 With<Parameter Type>: 다음 (변경 가능한 클래스도하고, Mutable 부분 제외) NS 부분없이 클래스 명으로 구성되어 있다는 점이다 및 하나 이상의 파라미터를 포함 할 수있다. 이름은 (URLWithString:처럼, 평소 용의자 제외.) 소문자로 시작

는 예를 들어, 다음 줄은 하나의 요소와 함께 오토 릴리즈 NSArray 인스턴스를 제공

[NSArray arrayWithObject: @"Test"] 

것은 나도 몰라 컴파일러에이 유형의 생성자를 인식하는 특별한 규칙이있는 경우.

+0

자동 반환 된 인스턴스를 반환하지 않아도됩니다. 그들은 기존 인스턴스, 특히 싱글 톤 또는 인턴 된 객체를 반환 할 수 있습니다 (NSNumber, 예를 들어, 적어도 32 비트에서 특정 정수 값을위한 인턴 객체). –

+0

바로 그 점을 잊어 버렸습니다. 덧글을 추가했습니다. 감사합니다. 또 다른 예는'stringWithString :'입니다.이 문자열은 불변 문자열이 전달되면 동일한 인스턴스를 반환합니다. – Monolo