비디오: Week 1, continued 2024
iOS 응용 프로그램에 ARC를 사용할 수 있습니다. ARC (Automatic Reference Counting)는 Objective-C 객체의 수명 관리 프로세스를 단순화하는 컴파일러 수준의 기능입니다. ARC는 객체를 유지하거나 해제 할 때를 기억하지 않고 객체의 수명 요구 사항을 평가하고 컴파일 타임에 적절한 메소드 호출을 자동으로 합성합니다.
새로운 런타임 메모리 모델이 아니며 가비지 수집기가 아닙니다. 모든 작업은 컴파일러에서 수행됩니다. ARC는 명명 규칙을 활용하여 (그리고 컴파일러가 시행하도록) 객체를 유지하고 해제하는 프로세스를 처리합니다. 또한 새로운 객체 포인터 소유권 한정자에 의존합니다.
ARC는 malloc () 및 free () (C 함수)를 자동화하지 않고 (CF) 또는 (CG)를 자동화하지 않습니다.ARC는 메모리를 관리하기 위해 몇 가지 제한 사항을 적용합니다. 주로 모범 사례를 적용하고 다른 방법을 허용하지 않습니다. ARC를 사용하기 위해 만들어진 앱에서 대부분을 염려 할 필요가 없습니다.
규칙 1:
-
retain , release 또는 autorelease 메소드를 호출하지 마십시오. 또한 사용자 지정 또는 메서드를 구현할 수 없습니다. Objective-C 프로그래밍을 처음 사용하는 사람이라면이 규칙은 기존 앱에서 수행하지 않을 것이므로 사용자에게 아무런 의미가 없습니다. 이 규칙에 대해 알아야 할 유일한 이유는 메모리를 관리하기 위해 ARC가 아닌 코드가 무엇을하는지 이해하는 것입니다. 당신이 오래된 손이라면, 당신은이 방법들을 사용했을 것이고, 당신은 그것들을 사용하는 것이
아니라고 이야기하게되어 기쁠 것입니다.
규칙 2: C 구조체에 객체 포인터를 저장하지 마십시오.
-
컴파일러는 참조가오고 갈 때를 알아야하기 때문에 구조체에 객체 포인터를 저장할 수 없습니다. 대부분의 독자는 C 구조체가 아닌 객체를 사용하기 때문에 문제가되지 않습니다. 규칙 3: Core Foundation 스타일의 객체를 사용할 때 컴파일러에 소유권에 대해 알립니다.
-
iOS 앱에서는 종종 CoreFoundation 프레임 워크를 사용합니다. CoreFoundation 객체는 예를 들어 주소록 기능과 같은 CF로 시작하는 모든 것입니다.CoreFoundation 객체는 다음과 같습니다.
AudioServicesCreateSystemSoundID ((__bridge CFURLRef) burnRubberURL, burnRubberSoundID);
ARC는 CoreFoundation 유형의 수명을 자동으로 관리하지 않으며 CFRetain 및 CFRelease (또는 해당 유형별 변형)와 같이 사용할 수있는 CoreFoundation 메모리 관리 규칙 및 기능이 있습니다.
대개의 경우 Objective-C 객체를 CoreFoundation 유형 객체로 캐스팅하거나 CoreFoundation 유형 객체로 캐스팅하기 때문에 메모리 관리에 대해 걱정할 필요가 없습니다. 그 결과 CoreFoundation 메모리가 없게됩니다. 코드 관리 그래도 컴파일러로 하여금 메모리 관리에 대한 의미를 알리도록해야합니다.
_ 브리지 캐스트를 사용하여 ARC에게 걱정하지 말라고 말하면됩니다.
CoreFoundation 메모리 관리가있는 경우 CFBridgingRetain 또는 CFBridgingRelease와 같은 매크로가 ARC와 CoreFoundation간에 소유권을 이전합니다.
규칙 4: autorelease 블록의 시작을 표시하려면
-
@autoreleasepool 키워드를 사용하십시오. 이것은 당신이 염려하거나 뭔가 할 일이 아닙니다. 그럼에도 불구하고 그것은 규칙입니다. 규칙 5: 명명 규칙을 따르십시오.
-
컴파일러는 반환되는 객체를 기반으로 객체를 유지할지 여부를 알고 있습니다. 메서드에 의해 반환되는 객체가 유지되는 경우가 있으며 때로는 나중에 자동으로 다시 릴리스되기도합니다. 객체가 자동 릴리즈 될 경우 객체를 유지해야합니다. 이미 유지 된 경우 컴파일러에서 아무 것도하지 않기를 원할 것입니다. 컴파일러가 객체가 반환 될 때 보유되었는지 여부를 알 수있는 유일한 방법은 특정 명명 규칙을 사용하는 것입니다. ARC에서는 이러한 이름 지정 규칙이 이제 언어의 일부이므로 해당 규칙을 따라야합니다.
selector
의 첫 번째 부분 (메서드 이름)의 첫 번째 단어가 alloc, new, copy, muteable copy 또는 init 일 때 유지 된 객체가 반환되었음을 컴파일러에서 알 수 있습니다. 이 메소드는 소유권을 이전합니다. 여기서 소유권 이전 은 객체가 보유되었음을 의미합니다. 예가 NSString initWithFormat: 메소드입니다. "소유권"은 배타적 소유권이 아닙니다. 여러 객체가 동시에 하나의 객체를 소유 할 수 있습니다. 또한 속성의 이름은로 시작해서는 안됩니다. 규칙 6: 규칙 만 따르십시오.
그게 전부입니다. 방출이나 자동 회수가 없습니다. 메모리 관리에 대한 걱정없이 마음의 내용에 규칙과 코드를 따르십시오.
-
물론 어떤 상황에서는 컴파일러에게 원하는 것을 명시해야합니다. 이러한 경우 컴파일러에게 객체의 수명에 대해 명시 적으로 알려야합니다.