Saturday, April 29, 2017

iOS ARC 코딩 규칙

다음은 ARC를 적용하기 위한 코딩 상의 규칙이다.

1. 명시적으로 dealloc을 호출해서는 안된다.
2. retain, release, retainCount, autorelease를 명시적으로 호출하거나 오버라이드 할 수 없다.
3. dealloc 메소드에 대해 ARC의 적용을 받지 않는 인스턴스 변수를 해제하기 위해 오버라이드를 할 수는 있다. 단 이 때에도 [super dealloc]을 명시적으로 호출해서는 안된다.
4. CFRetain, CFRelease는 앞서 설명했듯이 사용할 수 있다. 코어 파운데이션 타입은 ARC에서 제외되므로 수동으로 관리해야 한다.
5. C구조체 내에 Objective-C 객체 포인터를 저장할 수 없다. 구조체보다는 Objective-C 객체를 쓸 것을 추천한다.
6. id 와 void *간의 캐주얼 캐스팅을 쓸 수 없다. 이들 간의 캐스팅에서는 컴파일러가 객체의 라이프사이클을 파악할 수 있도록 추가적인 지시어 (__reatin 등)를 써서 관계를 명시해야 한다.
7. NSAutoreleasePool 객체는 더 이상 쓸 수 없다. @autoreleasepool{ } 블럭을 사용한다.
8. NSZone을 쓸 수 없다. 어차피 ARC가 아니어도 최신 런타임은 이를 무시해버린다.
9. 접근자명에 new를 붙일 수 없다. @property NSString *newTitle;은 컴파일 오류를 일으킨다.
10. 단, getter 명을 바꾸면 쓸 수는 있다. @property (getter=theNewTitle) NSString *newTitle;은 동작한다.

변수 지정자
프로퍼티 지정자처럼 변수 지정자가 추가되었다.
__strong__weak
__unsafe_unretained__autoreleasing
__strong은 디폴트 값이다. 이 변수에 할당한 객체는 강한 참조를 하게 된다.
weak는 약한 참조만을 갖도록 한다. 변수가 가리키는 객체가 파괴되면 (객체는 강한참조의 수가 0일 때 자동으로 파괴된다) nil로 변경된다.

unsafe_unretained 는 강한 참조처럼 객체를 유지하지 않지만 약참조처럼 nil로 변경되지 않는다. CF객체나 C포인터등을 가리킬 때 사용한다.
__autoreleasing은 자동 해제될 객체를 담는 변수이다. 함수의 인자로 넘겨지는 변수는 모두 이 타입을 사용한다.

strong = retain
weak = objective c
assign = c

No comments:

Post a Comment