Jest to bardzo proste. Kiedy używasz ARC (automatyczne liczenie odnośników), kompilator zadba o to, ile obiektów są wskazywane przez zmienne. Kiedy liczba trafi do 0, obiekt jest automatycznie dealocated. W przypadku rzeczy, które pochodzą z niskiego poziomu struktury, takich jak podstawowe podstawy, kompilator nie wie, co robić. Więc używasz BRIDGE, jeśli chcesz po prostu powiedzieć kompilatorowi "zignoruj ten, wydam go, kiedy go potrzebuję". lub Bridge transfer, jeśli chcesz powiedzieć "Traktuj to jako obiekt i zwolnij go, gdy odwołanie się do 0)."
Kiedy to zrobisz, tworzymy kopię, która w normalnych okolicznościach powinna zostać wydana przez "CFRelease" :
ABAddressBookCopyArrayOfAllPeople(addressBook)
jednak dodając to, jesteś przeniesienie własności do obiektu objective-c:.
NSArray *allPeople = (__bridge_transfer NSArray*)........
Więc NSArray będzie zarządzany przez ARC
Zauważ, że jak wspomina JRG, to robi:
CFRelease(addressBook);
Nie wpływa na nowo utworzony obiekt w każdym razie, ale zamiast oryginalnego jeden, który trzeba jeszcze ręcznie zwolnić: (Łatwo powiedzieć ponieważ metody te zwykle mają tworzyć lub skopiować słów kluczowych w ich nazw)
coś, co nie zdarza w twoim kodzie, ale powinieneś być ostrożny z tym, że uwolnienie podstawowych obiektów fundamentowych, które są NULL z CFRelease spowoduje błąd. Jak wspomina Paul w swoim komentarzu.
thx, czy możesz wyjaśnić, co oznacza "przenoszenie własności"? – Rinat
Własność to ważna kluczowa koncepcja w zarządzaniu pamięcią. "Właściciel" obiektu jest odpowiedzialny za zwolnienie jego pamięci. Jeśli tego nie zrobi, obiekt wycieknie. Obiekt może mieć więcej niż jednego właściciela, więc ostatni właściciel, który wykracza poza zakres, jest odpowiedzialny za deallokację w tym przypadku. ARC robi to automatycznie, ale TYLKO dla obiektów C-Object. Obiekty CoreFoundation są obiektami waniliowymi C, więc musisz podać wskazówki kompilatora, jak sobie z nimi radzić. Jeśli "przeniesiesz własność" na ARC, mówisz, że ARC jest odpowiedzialna za zwolnienie obiektu. – borrrden
Przepraszamy za spóźnienie w odpowiedzi. Własność dotyczy głównie tego, kto jest odpowiedzialny za uwolnienie obiektu. Jeśli chcesz uzyskać szczegółowe informacje, zapoznaj się z [Polityka własności] (https://developer.apple.com/library/mac/#documentation/CoreFOundation/Conceptual/CFMemoryMgmt/Concepts/Ownership.html). –