[iOS7의 일부 요약] 1. ARC 자동 참조 계수

소프트웨어 개발에 있어 참조 계수 Reference Counting은 생소한 개념이 아닙니다.이것은 어셈블리 개체 모델 COM에서 매우 중요한 개념입니다.모든 대상이 하나의 양을 유지하고 있는데 이를'인용계수'라고 부른다. 이것은 얼마나 많은'고객'프로그램이 현재의 대상을 인용하고 있는지 상징한다.현재 대상, 즉 인용 계수가 0이 아니라면 이 대상은 메모리에 저장되어 사라지지 않습니다.현재 대상을 인용하는 '고객' 이 없으면 인용 계수는 0으로 설정되며, 이 대상은 메모리에서 방출됩니다.이런 메커니즘을 통해 이미 폐기된 대상이 메모리에 계속 존재하여 메모리 유출을 초래하는 것을 방지할 수 있을 뿐만 아니라, 원래 존재하지 않았던 대상을 방출하여 버그를 일으키는 것도 방지할 수 있다.
이 과정을 형상적으로 설명하자면'주정뱅이 몇 명이 술집에 가서 술을 마신다'고 이해할 수 있다.이 몇 명의 술주정뱅이들이 술집에 들어와 앉았는데, 술집 주인은 그들에게 맥주 한 통을 주었고, 아무도 빨대를 보내지 않았다.여기서는 맥주통을 프로그램의'대상', 주정뱅이를 고객 프로그램으로 삼을 수 있다.술주정뱅이가 빨대를 술통에 꽂으면 이 고객은 현재 대상을 인용하기 시작한다. 그 인용 계수는 1이다.두 번째 주정뱅이도 빨대를 술통에 꽂고 술을 마시기 시작하면 인용계수가 2가 된다.이때 첫 번째 주정뱅이가 술을 멈추고 빨대를 뽑으면 여전히 한 사람이 빨대로 술을 마신다. 즉 인용계수가 2에서 1로 바뀐다.마찬가지로 셋째, 넷째 주정뱅이도 빨대로 술을 마시기 시작할 수도 있고, 잠시 술을 멈출 수도 있다.이런 환경에서'인용계수'는 하나의 수량이라고 볼 수 있는데 이것은 현재 몇 명의 술주정뱅이의 빨대가 술통에 연결되어 있음을 설명한다.적어도 한 사람이 습관적으로 술을 마신다면 술집 주인은 술통을 거두지 않을 것이다. 술통에 있는 것만 다 마시고 모두가 빨대를 뽑는다. 이때 술통의'인용계수'가 0이 된다. 이때 술꾼들은 계산을 하고 간다. 술집 주인은 술통을 거두어간다. 이 대상은 고객 프로그램 인용이 없고 메모리에서 방출된다는 뜻이다.'인용계수'라는 방법을 채택하면 술집 주인에게 많은 번거로움을 줄일 수 있다. 만약에 아직도 누군가가 마시고 있다면 술집 주인이 술통을 거두어갈 것이다. 그 술주정뱅이는 틀림없이 술주정뱅이가 술주정뱅이를 일으켜 탁자를 젖힐 것이다(O( 번)O하하~)만약 사람들이 모두 계산을 하고 나가면 술통이 아직도 책상 위에 놓여 있다. 그러면 술집의 뒤집히는 확률을 낮추고 이윤에 영향을 줄 것이다.이것이 바로 인용계수가 메모리 유출을 방지하고 코드 효율을 높이는 작용이다.
iOS 개발에서도 마찬가지로 이런 문제점이 존재하고 개발자는 자칫하면 잊어버린다.따라서 iOS5부터 애플은 ARC와 같은 메커니즘을 제공하여 이러한 문제를 처리하고 코드에서 자동으로 대상을retain,release로 조작하여 개발자의 부담을 덜었다.간단한 예를 들면 다음과 같습니다.
myClass *pObj = [[myClass alloc] init];
//.....
[self someMethod:pObj];
[pObj release];

어떤 때는 맨 마지막 줄의release 함수가 자주 잊혀지기 때문에 ARC를 사용한 후의 장점은 ARC가 pObj의 인용 계수를 자동으로 감시하고 적당한 때retain과release를 진행하는 것을 나타낸다.더 자세한 내용은 ARC에 대한 ios 공식 문서를 참조하십시오.
ARC를 사용할 때 주의해야 할 몇 가지 문제:
1. dealloc/retain/release/retainCount/autorelease를 표시할 수 없음;dealloc를 제외한 다른 함수도 다시 쓸 수 없음;
2. C구조체에서 하나의 Objective-c 대상을 가리키는 지침을 사용할 수 없으며 Objective-c류를 사용해야 한다.3. 속성property의 Getter 함수는 new로 시작할 수 없기 때문에 속성을 가져오는 방법을 다시 쓰지 않으면 속성의 이름도 new로 시작할 수 없습니다.
ARC에서 새로운 속성 한정어를 도입했습니다.
대상의 속성은 기본적으로 strong 유형이고 strong 유형은 실질적인 인용과 통제를 의미한다. 즉,'술을 마시는 주정뱅이'다.strong과retain은 같은 의미를 대표한다고 볼 수 있다.한편, weak 유형이 다르기 때문에 weak 유형의 인용은 대상의 생존 주기에 대한 통제를 의미하지 않는다. 이 대상의 강한 인용이 존재하지 않으면 약한 인용도nil로 설정된다.즉, 위크 타입의 인용자는 주정뱅이가 아니라 주정뱅이들이 술에 취해 추태를 부리며 횡설수설하는 것을 옆에서 지켜보는 무료한 사람들(허허), 주정뱅이가 술을 마시고 있으면 옆에서 보고, 주정뱅이가 가면 가고, 술집 주인도 이 빈 술통을 보고 있다고 해서 계속 통을 책상 위에 놓지 않는다는 것이다.
strong/weak을 사용하여 반복 참조를 방지합니다.
어떤 때는 두 대상 사이에 상호 관계가 존재할 수 있다. 만약에 두 관계가 모두 강한 인용이라면 이 두 대상은 인용 계수가 0일 때도 영원히 존재하지 않고 방출되지 않을 것이다.그 중 하나를 weak로 설정하면 이 문제를 잘 해결할 수 있습니다.

좋은 웹페이지 즐겨찾기