36

Objective-C. Leksykon profesjonalisty - Helionpdf.helion.pl/objclp/objclp.pdf · 2019-05-15 · Objective-C na poziomie jzyka nie pozwala na alokacj lub dealokacj obiek-tów. Jest

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Objective-C. Leksykon profesjonalisty - Helionpdf.helion.pl/objclp/objclp.pdf · 2019-05-15 · Objective-C na poziomie jzyka nie pozwala na alokacj lub dealokacj obiek-tów. Jest
Page 2: Objective-C. Leksykon profesjonalisty - Helionpdf.helion.pl/objclp/objclp.pdf · 2019-05-15 · Objective-C na poziomie jzyka nie pozwala na alokacj lub dealokacj obiek-tów. Jest

• Kup książkę• Poleć książkę • Oceń książkę

• Księgarnia internetowa• Lubię to! » Nasza społeczność

Page 3: Objective-C. Leksykon profesjonalisty - Helionpdf.helion.pl/objclp/objclp.pdf · 2019-05-15 · Objective-C na poziomie jzyka nie pozwala na alokacj lub dealokacj obiek-tów. Jest

Spis tre�ci

O autorze ..........................................................................9

Podzi�kowania ...............................................................11

Wprowadzenie ...............................................................13

Rozdzia� 1. Filozofia Objective-C .....................................................15Model obiektowy ................................................................................... 15Opowie�� o dwóch systemach typów .................................................... 17C to Objective-C .................................................................................... 17J�zyk i biblioteka ................................................................................... 18Historia Objective-C .............................................................................. 20Wieloplatformowo�� ............................................................................. 22Kompilowanie programów napisanych w Objective-C ......................... 23

Rozdzia� 2. Elementarz Objective-C ................................................25Deklarowanie typów w Objective-C ..................................................... 26Wysy�anie wiadomo�ci .......................................................................... 28Selektory ............................................................................................... 30Deklarowanie klas ................................................................................. 31Protoko�y ............................................................................................... 35Dodawanie metod do istniej�cej klasy ................................................... 36Nieformalne protoko�y .......................................................................... 38Generowanie metod przy u�yciu zadeklarowanych w�a�ciwo�ci .......... 38S�owa kluczowe self, _cmd i super ........................................................ 42Wska�nik isa ......................................................................................... 44Inicjalizowanie klas ............................................................................... 46Kodowanie typów .................................................................................. 47U�ywanie bloków .................................................................................. 49

Page 4: Objective-C. Leksykon profesjonalisty - Helionpdf.helion.pl/objclp/objclp.pdf · 2019-05-15 · Objective-C na poziomie jzyka nie pozwala na alokacj lub dealokacj obiek-tów. Jest

4 Spis tre�ci

Rozdzia� 3. Zarz�dzanie pami�ci� ..................................................51Zajmowanie i zwalnianie pami�ci ......................................................... 51Przypisywanie do zmiennych instancyjnych ......................................... 52Automatyczne zliczanie referencji ........................................................ 53Zwracanie obiektów przez argumenty b�d�ce wska�nikami ................. 54Unikanie cykli pozyskanych referencji .................................................. 56Migracja do ARC .................................................................................. 57Pule automatycznego zwalniania pami�ci ............................................. 59Konstruktory automatycznie zwalniaj�ce pami�� .................................. 61Automatyczne zwalnianie obiektów w akcesorach ............................... 61Wsparcie dla automatycznego od�miecania kolekcji ............................. 62Wspó�praca z C ..................................................................................... 64Niszczenie obiektów .............................................................................. 65S�abe referencje ..................................................................................... 66Alokowanie skanowanej pami�ci .......................................................... 68

Rozdzia� 4. Najwa�niejsze wzorce w Objective-C .........................71Dwufazowe tworzenie obiektów ........................................................... 71Kopiowanie obiektów ............................................................................ 72Archiwizowanie obiektów ..................................................................... 74Tworzenie wyznaczonych inicjalizatorów ............................................. 76Singleton ............................................................................................... 77Delegowanie .......................................................................................... 79Budowanie fasad ................................................................................... 80Tworzenie klastrów klas ........................................................................ 81P�tla wykonania .................................................................................... 83

Rozdzia� 5. Liczby ..............................................................................85Przechowywanie liczb w kolekcjach ..................................................... 86Arytmetyka liczb dziesi�tnych .............................................................. 88Konwersje mi�dzy ci�gami znakowymi i liczbami ............................... 90Odczytywanie liczb z ci�gów znakowych ............................................. 91

Rozdzia� 6. Operacje na ci�gach znakowych ...............................93Tworzenie sta�ych ci�gów znakowych .................................................. 94Porównywanie ci�gów znakowych ........................................................ 94Przetwarzanie ci�gu znakowego litera po literze ................................... 96Zmiana kodowania ci�gów znakowych ................................................. 98Przycinanie ci�gów znakowych ........................................................... 100Dzielenie ci�gów znakowych .............................................................. 101Kopiowanie ci�gów znakowych .......................................................... 101Tworzenie ci�gów znakowych z szablonów ........................................ 103Dopasowywanie wzorców do ci�gów znakowych ............................... 105Przechowywanie tekstu z formatowaniem ........................................... 106

Page 5: Objective-C. Leksykon profesjonalisty - Helionpdf.helion.pl/objclp/objclp.pdf · 2019-05-15 · Objective-C na poziomie jzyka nie pozwala na alokacj lub dealokacj obiek-tów. Jest

Spis tre�ci 5

Rozdzia� 7. Kolekcje ........................................................................109U�ywanie tablic ................................................................................... 110Kontrolowanie indeksów ..................................................................... 111Przechowywanie nieuporz�dkowanych grup obiektów ....................... 112Tworzenie s�ownika ............................................................................ 113Iterowanie po kolekcji ......................................................................... 114Wyszukiwanie obiektu w kolekcji ....................................................... 116Dziedziczenie z kolekcji ...................................................................... 118Przechowywanie obiektów Objective-C w kolekcjach C++ ................ 120

Rozdzia� 8. Data i czas ....................................................................123Odczytywanie aktualnej daty ............................................................... 123Przygotowanie dat do wy�wietlenia .................................................... 124Zliczanie up�ywaj�cego czasu ............................................................. 126Odczytywanie dat z ci�gów znakowych .............................................. 126Zdarzenia stopera ................................................................................ 127

Rozdzia� 9. Listy w�a�ciwo�ci ..........................................................129Przechowywanie kolekcji w listach w�a�ciwo�ci ................................. 130Odczytywanie danych z listy w�a�ciwo�ci ........................................... 131Zmiana formatu list w�a�ciwo�ci ......................................................... 133JSON ................................................................................................... 134Przechowywanie ustawie ................................................................... 135Przechowywanie dowolnych obiektów w systemie ustawie .............. 138

Rozdzia� 10. Interakcja ze �rodowiskiem ........................................141Pobieranie warto�ci �rodowiskowych .................................................. 141Przetwarzanie argumentów z linii komend .......................................... 142Ustawienia regionalne u�ytkownika .................................................... 144Nag�e zakoczenie programu .............................................................. 145

Rozdzia� 11. Kodowanie klucz-warto�� ..........................................147Dost�p do warto�ci poprzez klucz ....................................................... 147Uzyskiwanie zgodno�ci z KVC ........................................................... 148cie�ki do klucza ................................................................................. 151Obserwowanie kluczy ......................................................................... 152Uzyskiwanie zgodno�ci z KVO ........................................................... 153

Rozdzia� 12. Obs�uga b��dów ..........................................................155Ró�nice w implementacji wyj�tków .................................................... 156Rzucanie i �apanie wyj�tków ............................................................... 157Obiekty wyj�tków ............................................................................... 159Zunifikowany model wyj�tków ........................................................... 160Wyj�tki a zarz�dzanie pami�ci� .......................................................... 161Przekazywanie delegat z b��dami ........................................................ 162Zwracanie informacji o b��dzie ........................................................... 163NSError ............................................................................................... 164

Page 6: Objective-C. Leksykon profesjonalisty - Helionpdf.helion.pl/objclp/objclp.pdf · 2019-05-15 · Objective-C na poziomie jzyka nie pozwala na alokacj lub dealokacj obiek-tów. Jest

6 Spis tre�ci

Rozdzia� 13. Dost�p do katalogów i plików ....................................167Odczytywanie pliku ............................................................................. 167Przenoszenie i kopiowanie plików ...................................................... 169Pobieranie atrybutów pliku .................................................................. 170Modyfikacja �cie�ek ............................................................................ 171Sprawdzanie, czy plik lub katalog istnieje ........................................... 172Praca z pakietami ................................................................................. 173Odszukiwanie plików w lokacjach systemowych ................................ 175

Rozdzia� 14. W�tki .............................................................................179Tworzenie w�tków .............................................................................. 179Ustawianie priorytetu w�tku ................................................................ 180Synchronizowanie w�tków .................................................................. 182Przechowywanie danych specyficznych dla danego w�tku ................. 183Oczekiwanie na prawdziwo�� warunku ............................................... 185

Rozdzia� 15. Bloki i Grand Central ...................................................189Wi�zanie zmiennych z blokami ........................................................... 189Zarz�dzanie pami�ci� a bloki .............................................................. 192Wykonywanie czynno�ci w tle ............................................................ 194Tworzenie w�asnych kolejek pracy ..................................................... 196

Rozdzia� 16. Powiadomienia ............................................................199��danie powiadomie ......................................................................... 199Wysy�anie powiadomie ..................................................................... 201Kolejkowanie powiadomie ................................................................ 201Przesy�anie powiadomie mi�dzy aplikacjami .................................... 202

Rozdzia� 17. Sie� ................................................................................205Wykorzystywanie obudowanych socketów z j�zyka C ....................... 205��czenie si� z serwerami ..................................................................... 207Przesy�anie obiektów przez sie� .......................................................... 208Wyszukiwanie w�z�ów równoleg�ych ................................................. 210Wczytywanie danych spod adresu URL .............................................. 212

Rozdzia� 18. Debugowanie Objective-C ........................................215Inspekcja obiektów .............................................................................. 215Rozpoznawanie problemów z pami�ci� .............................................. 217Obserwowanie wyj�tków .................................................................... 218Asercje ................................................................................................. 220Zapisywanie wiadomo�ci o b��dach .................................................... 221

Page 7: Objective-C. Leksykon profesjonalisty - Helionpdf.helion.pl/objclp/objclp.pdf · 2019-05-15 · Objective-C na poziomie jzyka nie pozwala na alokacj lub dealokacj obiek-tów. Jest

Spis tre�ci 7

Rozdzia� 19. �rodowisko uruchomieniowe Objective-C ...............223Wysy�anie wiadomo�ci na podstawie nazwy ....................................... 223Odszukiwanie klas wed�ug nazwy ....................................................... 224Sprawdzanie, czy obiekt posiada dan� metod� .................................... 225Przekierowywanie wiadomo�ci ........................................................... 227Odszukiwanie klas ............................................................................... 228Inspekcja klas ...................................................................................... 229Tworzenie nowych klas ....................................................................... 231Dodawanie nowych zmiennych instancyjnych .................................... 232

Skorowidz ......................................................................235

Page 8: Objective-C. Leksykon profesjonalisty - Helionpdf.helion.pl/objclp/objclp.pdf · 2019-05-15 · Objective-C na poziomie jzyka nie pozwala na alokacj lub dealokacj obiek-tów. Jest

8 Spis tre�ci

Page 9: Objective-C. Leksykon profesjonalisty - Helionpdf.helion.pl/objclp/objclp.pdf · 2019-05-15 · Objective-C na poziomie jzyka nie pozwala na alokacj lub dealokacj obiek-tów. Jest

Rozdzia� 3.

Zarz�dzanie pami�ci�

Je�li pochodzisz ze �rodowiska programistów C lub C++, prawdopodobnie we krwimasz �ledzenie w�asno�ci obiektów oraz r�czne alokowanie ich i niszczenie. Je�lipochodzisz ze �rodowiska programistów j�zyków podobnych do Javy, przywy-k�e� do automatycznego od�miecacza pami�ci, który wykonuje t� prac� za Ciebie.

Objective-C na poziomie j�zyka nie pozwala na alokacj� lub dealokacj� obiek-tów. Jest to pozostawione kodowi napisanemu w C. Alokacja obiektów nast�pujezwykle po wys�aniu do ich klasy wiadomo�ci +alloc, która z kolei wywo�uje metod�malloc() lub podobn�, by zarezerwowa� pami�� na obiekt. Wys�anie obiektowi wia-domo�ci –dealloc czy�ci i usuwa jego zmienne instancyjne.

Framework Foundation rozbudowuje to proste, r�czne zarz�dzanie pami�ci� o zlicza-nie referencji. Gdy tylko zrozumiesz, jak dzia�a, Twoje �ycie stanie si� prostsze.Nowsze kompilatory pomog� Ci, zdejmuj�c z Ciebie trud pisania kodu zliczaj�cegoreferencje.

Zajmowanie i zwalnianie pami�ci

6 NSArray *anArray = [NSArray array]; 7 anArray = [[NSArray alloc] init]; 8 [anArray release];

Z pliku: retainRelease.m

Z ka�dym obiektem dziedzicz�cym z NSObject jest powi�zany licznik referencji.Gdy osi�gnie warto�� 0, obiekt jest niszczony. Obiekt utworzony przy u�yciu+alloc lub podobnej metody, jak np. +new czy +allocWithZone:, rozpoczyna swój�ywot z licznikiem ustawionym na warto�� jeden.

Page 10: Objective-C. Leksykon profesjonalisty - Helionpdf.helion.pl/objclp/objclp.pdf · 2019-05-15 · Objective-C na poziomie jzyka nie pozwala na alokacj lub dealokacj obiek-tów. Jest

52 Rozdzia� 3 � Zarz�dzanie pami�ci�

Licznik referencji obiektu mo�na kontrolowa�, wysy�aj�c mu wiadomo�ci –retaini -release. Jak wskazuj� ich nazwy, wykorzystuje si� je do pozyskiwania referencjina obiekt lub jej zwalniania. Wiadomo�� –retain inkrementuje licznik referencji,a wiadomo�� –release go dekrementuje.

By okre�li� obecny stan licznika referencji, wy�lij wiadomo�� –retainCount. Kusz�cemo�e by� optymalizowanie kodu, polegaj�ce na wykorzystaniu specjalnego przy-padku, gdy istnieje tylko jedna referencja na obiekt. Jest to bardzo z�y pomys�.Jak sama nazwa wskazuje, metoda zwraca liczb� jawnie pozyskanych referencji,a nie referencji w ogóle. Podczas tworzenia na stosie wska�nika do obiektu po-wszechne jest niezawracanie sobie g�owy wysy�aniem do niego wiadomo�ci –retain.W efekcie do obiektu mog� prowadzi� dwie lub wi�cej referencji, cho� licznikjest ustawiony na jeden.

Wska�niki w Objective-C s� podzielone na dwie kategorie: referencje w�asno-�ciowe i referencje niew�asno�ciowe. Referencja w�asno�ciowa to taka, któramodyfikuje licznik referencji obiektu. Wywo�uj�c metody takie jak +new lub –retain,otrzymuje si� referencj� w�asno�ciow� do nowego obiektu. Wi�kszo�� pozosta-�ych metod zwraca referencje niew�asno�ciowe. Zmienne instancyjne i globalnes� przewa�nie wska�nikami w�asno�ciowymi, wi�c powinno si� im przypisa� re-ferencje w�asno�ciowe. Trzeba tak�e upewni� si�, �e przed przypisaniem nowejreferencji w�asno�ciowej usuni�to star� (wysy�aj�c wiadomo�� –release).

Zmienne tymczasowe s� zwykle referencjami niew�asno�ciowymi. Automatycznezliczanie referencji i od�miecanie pami�ci, którym przyjrzymy si� w dalszej cz��ciobecnego rozdzia�u, wprowadzaj� specjalne rodzaje tego typu referencji.

Przypisywanie do zmiennych instancyjnych

26 - (void)setStringValue: (NSString*)aString27 {28 id tmp = [aString retain];29 [string release];30 string = tmp;31 }

Z pliku: ivar.m

Jest kilka rzeczy, na które trzeba uwa�a� podczas korzystania ze zliczania referencji.Rozwa�my tak� oto prost� metod� ustawiaj�c�:

Page 11: Objective-C. Leksykon profesjonalisty - Helionpdf.helion.pl/objclp/objclp.pdf · 2019-05-15 · Objective-C na poziomie jzyka nie pozwala na alokacj lub dealokacj obiek-tów. Jest

Automatyczne zliczanie referencji 53

14 - (void)setStringValue: (NSString*)aString15 {16 [string release];17 string = [aString retain];18 }

Z pliku: ivar.m

Kod wygl�da rozs�dnie. Zwalniana jest referencja do starej warto�ci, po czym pozy-skiwana i przypisywana jest nowa warto��. Zwykle kod b�dzie dzia�a�, ale w kilkuprzypadkach zawiedzie. Czyni to debugowanie go zaj�ciem niezwykle trudnym.Co stanie si�, je�li warto�� aString i string b�d� takie same? W tym przypadkuwy�lesz jednemu obiektowi wiadomo�� –release, a nast�pnie –retain. O ile innykod utrzyma referencj� do obiektu, wszystko zadzia�a poprawnie, ale je�li nie, topierwsza wiadomo�� spowoduje zniszczenie obiektu, a druga zostanie wys�ana do„wisz�cego” wska�nika.Na pocz�tku rozdzia�u pokazano lepsz� implementacj�, która najpierw pozyskujereferencj� do nowego obiektu. Zwró� uwag�, �e powiniene� zachowa� warto��zwracan� z wiadomo�ci –retain, bo niektóre obiekty zwróc� inny obiekt, gdy jepozyskasz. To bardzo rzadkie zachowanie, ale wyst�puje raz na jaki� czas.W kocu metoda nie jest bezpieczna ze wzgl�du na w�tki. Je�li chcesz, by tak�by�a, musisz zarezerwowa� nowy obiekt, wykona� niepodzieln� operacj� podmianygo i zmiennej instancyjnej, a nast�pnie zwolni� star� warto��. Jest to fatalny po-mys�, bo ci��ko obj�� rozumem kod, który zawiera tak du�o drobiazgowej obs�ugiwspó�bie�no�ci, a ilo�� zmarnowanego cache’u przewy�szy zyski z równoleg�egowykonania. Je�li naprawd� potrzebujesz równoleg�ego wykonania, lepiej u�yj zade-klarowanych w�a�ciwo�ci do wygenerowania akcesoria, zamiast pisa� go r�cznie.

Automatyczne zliczanie referencjiWraz z wydaniem iOS 5 i Mac OS X 10.7 firma Apple wprowadzi�a automa-tyczne zliczanie referencji (Automatic Reference Counting — ARC). Koncep-cyjnie polega to na tym, �e kompilator sam decyduje, kiedy powinien wywo�a�–retain oraz –release, i robi to za Ciebie. Rzeczywista implementacja jest oczy-wi�cie nieco bardziej skomplikowana.Zamiast wstawia� bezpo�rednio do kodu wysy�anie wiadomo�ci, kompilator wstawiawywo�ania funkcji takich jak objc_retain() i objc_release(). Nast�pnie opty-malizator stara si� po��czy� lub wyeliminowa� te wywo�ania. W prostym przypadkufunkcje wykonuj� prac� analogiczn� do wysy�anych wiadomo�ci. Jednak w niektó-rych przypadkach s� znacznie bardziej efektywne.

Page 12: Objective-C. Leksykon profesjonalisty - Helionpdf.helion.pl/objclp/objclp.pdf · 2019-05-15 · Objective-C na poziomie jzyka nie pozwala na alokacj lub dealokacj obiek-tów. Jest

54 Rozdzia� 3 � Zarz�dzanie pami�ci�

Wi�kszo�� przyk�adów w tej ksi��ce korzysta z r�cznego zliczaniareferencji. Jest to celowe. Pomimo �e stosowanie ARC jest zalecanew nowych projektach, istnieje du�o starego kodu, który z niego niekorzysta. Nawet je�li wykorzystujesz ARC, wci�� powiniene� rozumie�istot� wykonywanego za Ciebie pozyskiwania i zwalniania referencji.Podobnie warto zna� zestaw instrukcji procesora, nawet je�li nigdy niepisze si� kodu w asemblerze. Programi�cie, który rozumie r�cznezliczanie referencji, bardzo �atwo jest przestawi� si� na zliczanieautomatyczne.

W prostych zastosowaniach wykorzystanie ARC pozwala zapomnie� o zarz�dzaniupami�ci�. Je�li u�ywasz nowej wersji �rodowiska XCode, ARC jest rozwi�zaniemdomy�lnym. Je�li kompilujesz z linii komend lub przy u�yciu jednego z innychsystemów budowania projektów, dodaj opcj� –fobjc-arc. Teraz wystarczy tylkozapomnie� o konieczno�ci pozyskiwania i zwalniania referencji.

By�oby wspaniale, gdyby �ycie by�o tak proste. Niestety ARC ma pewne ogranicze-nia. Mówi�c konkretniej, formalizuje m�tn� granic� mi�dzy pami�ci� C a obiek-tami Objective-C, dziel�c wska�niki na trzy kategorie. Silne wska�niki pozyskuj�i zwalniaj� pami�� tak, jak widzieli�my wcze�niej. S�abe, którym przyjrzymy si�pó�niej, to niew�asno�ciowe referencje zerowane automatycznie podczas niszczeniaobiektu. Ostatni� grup� stanowi� niebezpieczne, niepozyskane wska�niki. S� ignoro-wane przez ARC: sam jeste� odpowiedzialny za czas �ycia przechowywanych w nichobiektów.

Domy�lnie wszystkie wska�niki w zmiennych instancyjnych i na stosie s� mocne.Wska�niki na obiekty w strukturach nie maj� warto�ci domy�lnej i musz� by�jawnie oznaczone kwalifikatorem __unsafe_unretained. Mimo �e w ich przypadkujest to jedyne dozwolone prawo w�asno�ci, trzeba go jawnie u�y�, by przypo-mnie� osobom czytaj�cym kod, �e wska�niki te b�d� ignorowane przez ARC.

Zwracanie obiektów przez argumentyb�d�ce wskanikami

3 __weak id weak; 4 int writeBack(id *aValue) 5 { 6 *aValue = [NSObject new]; 7 weak = *aValue; 8 return 0; 9 }1011 int main(void)12 {

Page 13: Objective-C. Leksykon profesjonalisty - Helionpdf.helion.pl/objclp/objclp.pdf · 2019-05-15 · Objective-C na poziomie jzyka nie pozwala na alokacj lub dealokacj obiek-tów. Jest

Zwracanie obiektów przez argumenty b�d�ce wska�nikami 55

13 @autoreleasepool14 {15 id object;16 writeBack(&object);17 NSLog(@"Obiekt: %@", object);18 object = nil;19 NSLog(@"Obiekt: %@", weak);20 }21 NSLog(@"Obiekt: %@", weak);22 return 0;23 }

Z pliku: writeback.m

W trybie ARC argumenty b�d�ce wska�nikami do wska�ników dzia�aj� w dosy�skomplikowany sposób. Ich zastosowanie obejmuje zwykle dwa przypadki: prze-kazywanie tablic lub zwracanie obiektów. Je�li przekazujesz tablic� w dó� stosu,to powiniene� upewni� si�, �e zadeklarowa�e� j� jako const. Informuje to kompi-lator, �e wywo�ywana funkcja nie przypisze niczego do tablicy, wi�c ARC b�dziemóg� przekaza� j� bez �adnej skomplikowanej interwencji.

Je�li poprzez argumenty b�d�ce wska�nikami b�dziesz zwraca� obiekt, to ARCutworzy dosy� skomplikowany kod. W przyk�adzie z pocz�tku tego podrozdzia�uwywo�anie writeBack() generuje kod zbli�ony do tego:

id tmp = [object retain];writeBack(&tmp);[tmp retain];[object release];object = tmp;

W funkcji writeBack() nowy obiekt b�dzie automatycznie usuni�ty z pami�ci przedprzechowaniem go w tymczasowej warto�ci. Oznacza to, �e na kocu tego procesuobject zawiera w�asno�ciow� referencj� do nowego obiektu.

Je�li zadeklarowa�e� object jako _autoreleasing id, wygenerowany kod jestznacznie prostszy. Automatycznie zwalnia warto�� przechowywan� pocz�tkowow object, co nie b�dzie mia�o �adnego efektu, bo warto�ci� pocz�tkow� wszystkichwska�ników — nawet tych przydzielanych automatycznie — i tak jest nil, a na-st�pnie bezpo�rednio przekazuje wska�nik i oczekuje, �e je�li wywo�ywana funkcjago zmodyfikuje, to umie�ci na jego miejsce wska�nik niew�asno�ciowy (automa-tycznie zwalniany).

Page 14: Objective-C. Leksykon profesjonalisty - Helionpdf.helion.pl/objclp/objclp.pdf · 2019-05-15 · Objective-C na poziomie jzyka nie pozwala na alokacj lub dealokacj obiek-tów. Jest

56 Rozdzia� 3 � Zarz�dzanie pami�ci�

Je�li uruchomisz ten przyk�ad, to zobaczysz, �e s�aba referencja jest zerowanawy��cznie, gdy niszczona jest pula automatycznego przydzia�u. We wszystkichprzypadkach funkcja writeBack() przechowuje zwolniony automatycznie obiektw przekazanym wska�niku i nigdy nie usuwa z pami�ci przekazanej warto�ci.Wywo�uj�cy jest zawsze odpowiedzialny za upewnienie si�, �e do funkcji prze-kazuje referencj� niew�asno�ciow�, co czyni na jeden z dwóch sposobów: alboupewnia si�, �e wska�nik pokazuje na automatycznie zwalniany obiekt, albo �ejest kopi� wska�nika na obiekt, dla którego pozyskano referencj�.

Je�li zamiast tego oznaczysz parametr s�owem out (dozwolone wy��cznie w przypad-ku parametrów metod, a nie funkcji C), to wywo�ywana metoda gwarantuje, �enie odczyta tej warto�ci. Kompilator b�dzie móg� wi�c pomin�� krok, w którymwykonuje kopi� wska�nika przechowywanego w object przed wywo�aniem.

Je�li musisz przekaza� kilka obiektów w gór� stosu, to powiniene� prawdopodobniezwróci� instancj� NSArray. Jest kilka alternatyw, ale s� wystarczaj�co z�o�one, bynie by�y warte wysi�ku: korzystaj�c z nich, �atwo pope�ni� ma�y b��d i sp�dzi� wiekina debugowaniu kodu. Nawet je�li uda Ci si� zrobi� wszystko dobrze, przypusz-czalnie i tak metody te b�d� wolniejsze ni� u�ycie NSArray.

Je�li przekazujesz kilka warto�ci w dó� stosu, to powiniene� zadeklarowa� typtablicy z jawnym kwalifikatorem w�asno�ci dla parametru, a nie typ wska�nikowy.Na przyk�ad __unsafe_unretained id[] zamiast id*. Zapewnia to wy��czeniemechanizmu zapisu zwrotnego.

Unikanie cykli pozyskanych referencji

19 - (void)setDelegate: (id)aDelegate20 {21 delegate = aDelegate;22 }

Z pliku: ivar.m

Problemem w przypadku „czystego” zliczania referencji jest to, �e nie wykrywacykli. Je�li dwa obiekty przechowuj� referencje do siebie nawzajem, �aden z nichnie zostanie nigdy zwolniony.

Generalnie nie jest to wielki problem. Struktury danych w Objective-C s� zwykleacykliczne, ale istniej� przypadki, w których cykle s� nieuniknione. Najpopularniej-szym z nich jest wzorzec delegacji. Wzorzec polega na tym, �e jeden obiekt imple-mentuje jaki� mechanizm, ale zarz�dzanie prac� przekazuje innemu obiektowi.Wi�kszo�� frameworku AppKit dzia�a w ten sposób.

Page 15: Objective-C. Leksykon profesjonalisty - Helionpdf.helion.pl/objclp/objclp.pdf · 2019-05-15 · Objective-C na poziomie jzyka nie pozwala na alokacj lub dealokacj obiek-tów. Jest

Migracja do ARC 57

Obiekty potrzebuj� do siebie nawzajem referencji, co momentalnie tworzy cykl.Popularnym sposobem rozwi�zania problemu jest przyj�cie zasady, �e obiekty niepozyskuj� na siebie referencji. Je�li przeka�esz obiekt jako argument do metody–setDelegate:, b�dziesz musia� upewni� si�, �e referencja jest przechowywana przezjaki� inny obiekt lub �e zostanie przedwcze�nie zwolniona, a obiekt usuni�ty.

W przypadku ARC masz dwie mo�liwo�ci: mo�esz oznaczy� zmienn� instancyjn�s�owem __weak albo __unsafe_unretained. Pierwsza z opcji jest bezpieczniejsza,bo zapewnia, �e wska�nik nie b�dzie „wisia� w powietrzu”. Gdy delagata zostaniezniszczona, zmienna instancyjna zostanie ustawiona na nil.

S� dwie wady u�ywania s�abych wska�ników. Pierwsz� jest przeno�no��. S�abewska�niki dzia�aj� na iOS 5, Mac OS X 10.7 i w GNUstep, ale nie dzia�aj� nastarszych wersjach iOS i Mac OS X. Drug� wad� jest wydajno��. W ka�dej próbiedost�pu do wska�nika po�redniczy funkcja pomocnicza, sprawdzaj�ca, czy obiektnie jest w stanie dealokacji, i pozyskuj�ca referencj� do niego, je�li jest wci��„�ywy”, albo zwracaj�ca nil w przeciwnym przypadku.

Pod nazw� niebezpiecznych, niepozyskanych wska�ników kryj� si� zwyk�e, „tra-dycyjne” wska�niki, oferuj�ce tani dost�p do obiektu i dzia�aj�ce na ka�dej plat-formie sprz�towej. Ich wad� jest obarczanie u�ytkownika odpowiedzialno�ci� zaupewnienie si�, �e po zwolnieniu wskazywanego obiektu u�ytkownik nie si�gnieju� wi�cej do wska�nika.

Dobrym kompromisem jest u�ywanie s�abych wska�ników w trakcie debugowa-nia i niebezpiecznych, niepozyskanych wska�ników w trakcie normalnej pracy.Dodaj asercj� sprawdzaj�c�, czy wska�nik nie jest równy nil, przed wys�aniem mujakiejkolwiek wiadomo�ci, a je�li b�dziesz mia� b��dy, to skoczysz z u�ytecznymkomunikatem zamiast nag�ego przerwania aplikacji.

Migracja do ARCJe�li zaczynasz nowy projekt w XCode, ARC b�dzie domy�lnym wyborem i ci��koznale�� powody, by z niego nie skorzysta�. Je�li jednak pracujesz ze starszym ko-dem, prawdopodobnie b�dziesz u�ywa� r�cznego zliczania referencji. W d�ugiejperspektywie mo�na oszcz�dzi� sobie pracy, przenosz�c kod do ARC, ale jest tonieco trudniejsze ni� ustawienie prze��cznika kompilacji.

Clang posiada narz�dzie wspomagaj�ce migracj�, które próbuje przepisa� kodObjective-C tak, by korzysta� z ARC. Wywo�uje si� je z linii komend przy u�yciu ar-gumentów –ccc-arcmt-check i –ccc-arcmt-modify. Pierwszy z nich informujeo wszystkich miejscach w kodzie, które nie mog� by� automatycznie zmienione.O ile nie b�dzie b��dów, drugi wykona konwersj� kodu, modyfikuj�c oryginalny plik.

Page 16: Objective-C. Leksykon profesjonalisty - Helionpdf.helion.pl/objclp/objclp.pdf · 2019-05-15 · Objective-C na poziomie jzyka nie pozwala na alokacj lub dealokacj obiek-tów. Jest

58 Rozdzia� 3 � Zarz�dzanie pami�ci�

W prostym kodzie Objective-C narz�dzie zadzia�a poprawnie. Najbardziej oczy-wistymi zmianami b�dzie usuni�cie wszystkich wiadomo�ci –retain, –releasei autorelease. Narz�dzie usunie tak�e jawne wywo�anie [super dealloc] z metody–dealloc. Od teraz wywo�anie jest wstawiane automatycznie przez kompilator.ARC automatycznie zwalnia wszystkie zmienne instancyjne, wi�c metod� –deallocb�dziesz musia� zaimplementowa�, tylko je�li musisz zwolni� pami�� zaj�t� przezfunkcj� malloc() lub podobne konstrukcje.

Je�li utworzy�e� w�asne metody do zliczania referencji, b�dziesz musia� je usun��.Popularnym powodem w�asnej implementacji jest ch�� unikni�cia przypadkowegousuni�cia singletonów. Traci to na znaczeniu w przypadku ARC, poniewa� b��dprogramisty ma mniejsze szanse na spowodowanie przedwczesnego usuni�ciaobiektu.

Do zwalniania zmiennych instancyjnych ARC tworzy metod� –.cxx_destruct. Metoda ta by�a pierwotnie utworzona, by po zniszczeniuobiektu automatycznie wywo�ywa� destruktory z C++. Widoczn� ró�-nic� pomi�dzy jej dawnym zastosowaniem a ARC w Objective-C jest to,�e zmienne instancyjne s� teraz dealokowane po wykonaniu funkcji–dealloc w klasie-korzeniu, a nie przed. W wi�kszo�ci przypadków niepowinno mie� to znaczenia.

Najwi�ksze problemy pojawiaj� si�, je�li próbujesz przechowa� wska�niki Ob-jective-C w strukturach C. Najprostszym rozwi�zaniem jest po prostu nierobienietego. W zamian u�yj obiektów Objective-C z publicznymi zmiennymi instancyjnymi.Pozwoli to kompilatorowi zaj�� si� zarz�dzaniem pami�ci� obiektu i jego pól.

Jedynym przypadkiem, w którym uznaje si�, �e u�ywanie struktur odnosz�cych si�do obiektów Objective-C jest bezpieczne, jest sytuacja, gdy przekazujesz je w dó�stosu. Wska�niki na obiekty mog� posiada� kwalifikator __unsafe_unretainedtak d�ugo, jak d�ugo pozostaj� poprawne w funkcji, w której powsta�y.

Po u�yciu narz�dzia do migracji zauwa�ysz, �e znikn��y w�a�ciwo�ci assign. Zosta�yone przepisane jako unsafe_unretained lub weak, w zale�no�ci od tego, czy wy-brana platforma docelowa kompilacji obs�uguje s�abe referencje. Je�li w�a�ciwo�ciassign wykorzystywa�e� do przerywania prostych cykli i uznasz, �e s�abe referencjestwarzaj� problemy wydajno�ciowe, mo�esz jawnie zmieni� niektóre z nich naunsafe_unretained.

Narz�dzie do migracji spróbuje w odpowiednich miejscach powstawia� rzutowaniemostkowane __bridge, ale warto sprawdzi�, czy zrobi�o to poprawnie. Rzutowaniate s� wykorzystywane do dodawania i usuwania obiektów z kodu zarz�dzanegoprzez ARC. W kodzie niewykorzystuj�cym ARC mo�na korzysta� z konstrukcji ta-kich jak (void*)someObject, bo wska�niki na obiekty s� zwyk�ymi wska�nikami C,

Page 17: Objective-C. Leksykon profesjonalisty - Helionpdf.helion.pl/objclp/objclp.pdf · 2019-05-15 · Objective-C na poziomie jzyka nie pozwala na alokacj lub dealokacj obiek-tów. Jest

Pule automatycznego zwalniania pami�ci 59

do których dodatkowo mo�na wysy�a� wiadomo�ci. W trybie ARC rzutowanieby�oby wieloznaczne, bo kompilator nie wiedzia�by, która zmienna ma by� w�a�ci-cielem obiektu wskazywanego przez void*. Z tego powodu taki kod jest zabroniony.

Narz�dzie do migracji przepisze przedstawion� wy�ej konstrukcj� jako (__bridgevoid*)someObject, ale mo�e to nie by� to, o co Ci chodzi�o. Tego typu rzutowaniombardziej szczegó�owo przyjrzymy si� w podrozdziale „Wspó�praca z C”.

Pule automatycznego zwalniania pami�ci

3 id returnObject(void) 4 { 5 return [[NSObject new] autorelease]; 6 } 7 8 int main(void) 9 {10 @autorelease {11 id object = returnObject();12 [object retain];13 }14 // Tutaj obiekt traci wa�no��.15 [object release];16 return 0;17 }

Z pliku: autorelease.m

Poza cyklami najwi�kszym problemem w przypadku zliczania referencji s� krótkieokresy, w których na obiekt nie wskazuje �adna referencja. W j�zyku C problememjest decyzja, kto jest odpowiedzialny za alokowanie pami�ci: wywo�uj�cy czy wy-wo�ywany.

W funkcjach takich jak sprintf() pami�� zajmuje wywo�uj�cy. Niestety nie wie on,ile pami�ci tak naprawd� jest potrzebne, wi�c utworzono wariant o nazwie snprintf(),który informuje wywo�an� funkcj� o ilo�ci dost�pnej pami�ci. Takie rozwi�zaniewci�� mo�e sprawia� problemy, wi�c utworzono jeszcze jedn� wersj� o nazwieasprintf(), która pozwala wywo�ywanej funkcji zaj�� si� alokowaniem pami�ci.

Je�li pami�� zajmuje wywo�ywana funkcja, kto jest odpowiedzialny za jej zwol-nienie? Prawdopodobnie wywo�uj�cy, ale poniewa� to nie on zaj�� pami��, toprogramy sprawdzaj�ce równowag� mi�dzy wywo�aniami funkcji malloc() i free()nie poradz� sobie ze spostrze�eniem potencjalnego wycieku pami�ci.

Page 18: Objective-C. Leksykon profesjonalisty - Helionpdf.helion.pl/objclp/objclp.pdf · 2019-05-15 · Objective-C na poziomie jzyka nie pozwala na alokacj lub dealokacj obiek-tów. Jest

60 Rozdzia� 3 � Zarz�dzanie pami�ci�

W Objective-C problem ten wyst�puje jeszcze cz��ciej. Wiele metod mo�e zwraca�obiekty tymczasowe, które musz� zosta� zwolnione. Z kolei gdy zwracaj� wska�nikna zmienn� instancyjn�, nie trzeba go zwalnia�. Mo�na by najpierw pozyskiwa�takie wska�niki, ale potem trzeba by pami�ta�, �eby zwalnia� ka�dy obiekt zwra-cany z metody. Szybko sta�oby si� to m�cz�ce.

Rozwi�zaniem problemu jest pula automatycznego zwalniania pami�ci. Po wy-s�aniu do obiektu wiadomo�ci –autorelease jest on dodawany do aktywnej w danymmomencie puli NSAutoreleasePool. Gdy instancja puli jest niszczona, ka�demudodanemu do niej obiektowi jest wysy�ana wiadomo�� –release.

-autorelease to opó�niona wiadomo�� –release. Wysy�a si� j� do obiektu, gdysamemu nie potrzebuje si� ju� referencji do niego, ale komu� innemu mo�e jeszczeby� potrzebna.

Je�li u�ywasz p�tli wykonania NSRunLoop, pula automatycznego zwalniania pa-mi�ci b�dzie tworzona na pocz�tku, a niszczona na kocu ka�dej iteracji p�tli.Oznacza to, �e �aden tymczasowy obiekt nie zostanie zniszczony do koca obec-nej iteracji. Je�li robisz co�, co wymaga du�ej ilo�ci takich obiektów, mo�eszchcie� utworzy� now� pul� automatycznego zwalniania. Robi si� to w nast�puj�cysposób:

id pool = [NSAutoreleasePool new];[anObject doSomethingThatCreatesObjects];[pool drain];

Zwró� uwag�, �e aby zniszczy� pul�, trzeba jej wys�a� wiadomo�� –drain, a nie–release. Jest tak, bo w trybie od�miecania pami�ci �rodowisko uruchomienioweObjective-C ignoruje wiadomo�ci –release. Wiadomo�� –drain jest wskazówk�dla od�miecacza, ale w trybie od�miecania pami�ci nie powoduje natychmiastowegozniszczenia puli.

W OS X 10.7 firma Apple uczyni�a pul� automatycznego zwalniania pami�cicz��ci� j�zyka. Programy jawnie u�ywaj�ce NSAutoreleasePool s� uwa�ane zaniepoprawne w trybie ARC i zostan� odrzucone przez kompilator. Trzeba je za-st�pi� konstrukcj� @autoreleasepool, definiuj�c� region wa�no�ci puli. W trybachinnych ni� ARC konstrukcja ta spowoduje wstawienie identycznego kodu jak w li-stingu powy�ej. W trybie ARC wstawione zostan� wywo�ania funkcji objc_autoreleasePoolPush() i objc_autoreleasePoolPop(), które wykonaj� podobn� prac�.

Page 19: Objective-C. Leksykon profesjonalisty - Helionpdf.helion.pl/objclp/objclp.pdf · 2019-05-15 · Objective-C na poziomie jzyka nie pozwala na alokacj lub dealokacj obiek-tów. Jest

Konstruktory automatycznie zwalniaj�ce pami�� 61

Konstruktory automatycznie zwalniaj�ce pami��

4 + (id)object 5 { 6 return [[[self alloc] init] autorelease]; 7 }

Z pliku: namedConstructor.m

W poprzednim podrozdziale powiedzia�em, �e obiekty utworzone przy u�yciu +allocmaj� licznik referencji ustawiony na jeden. W rzeczywisto�ci wszystkie obiektys� tworzone z licznikiem ustawionym na jeden, ale obiekty tworzone przy u�yciu na-zwanego konstruktora, np. +stringWithFormat: lub +array, s� tak�e automatycznieusuwane z pami�ci.

By zachowa� obiekt tworzony przy u�yciu jednego z tych mechanizmów, trzebawys�a� mu wiadomo�� –retain. W przeciwnym wypadku zostanie zniszczonyw trakcie usuwania puli automatycznego zwalniania pami�ci.

Jest to konwencja, któr� warto na�ladowa� we w�asnych klasach. Je�li kto� utworzyinstancj� jednej z Twoich klas, korzystaj�c z nazwanego konstruktora, b�dzieoczekiwa�, �e nie musi jej zwalnia�. Typowy nazwany konstruktor przypomina�byten z pocz�tku tego podrozdzia�u.

Zwró� uwag�, �e poniewa� jest to metoda klasowa, obiekt self b�dzie klas�. Wy-sy�aj�c wiadomo�� +alloc do self zamiast do klasy o okre�lonej nazwie, metodamo�e dzia�a� poprawnie równie� w przypadku podklas.

W trybie ARC te konwencje zosta�y sformalizowane w rodzinach metod. Metody,które zaczynaj� si� od s�ów alloc, new, copy lub mutableCopy, zwracaj� referencj�w�asno�ciow� — referencj�, która musi zosta� zwolniona, je�li nie b�dzie prze-chowywana. Inne metody zwracaj� referencje niew�asno�ciowe, które musz� zosta�automatycznie zwolnione lub przechowane w miejscu, co do którego gwarantujesi�, �e nie b�dzie zwolnione.

Automatyczne zwalnianie obiektów w akcesorach

34 - (NSString*)stringValue35 {36 return [[string retain] autorelease];37 }

Z pliku: ivar.m

Page 20: Objective-C. Leksykon profesjonalisty - Helionpdf.helion.pl/objclp/objclp.pdf · 2019-05-15 · Objective-C na poziomie jzyka nie pozwala na alokacj lub dealokacj obiek-tów. Jest

62 Rozdzia� 3 � Zarz�dzanie pami�ci�

Innym powszechnym problemem ze zliczaniem referencji w formie zaimplemento-wanej przez Foundation jest cz�ste niepozyskiwanie obiektów, które znajduj� si�na stosie. Rozwa�my nast�puj�cy fragment kodu:

NSString *oldString = [anObject stringValue];[anObject setStringValue: newString];

Je�li metoda –setStringValue: zosta�a zaimplementowana tak, jak sugerowa�emwcze�niej, to wykonanie kodu skoczy si� przerwaniem aplikacji, bo obiekt, doktórego odnosi si� oldString, zostanie usuni�ty przed ustawieniem nowej warto�cici�gu znakowego. Jest to problem maj�cy dwa mo�liwe rozwi�zania, obydwa ko-rzystaj�ce z puli automatycznego zwalniania pami�ci. Pierwsze polega na auto-matycznym zwolnieniu starej warto�ci podczas ustawiania nowej. Drugi to takiezdefiniowanie metody –stringValue, jak pokazano na pocz�tku tego podrozdzia�u.

Zapewnia to, �e ci�g znakowy nie zostanie przez przypadek zniszczony w trakcienormalnej pracy obiektu. Innym popularnym rozwi�zaniem jest zast�pienie wia-domo�ci –copy wiadomo�ci� –retain. Jest to u�yteczne, je�li zmienna instancyjnamo�e by� modyfikowana. Je�li nie mo�na jej modyfikowa�, –copy b�dzie odpo-wiednikiem –retain. Je�li mo�na j� modyfikowa�, wywo�uj�cy otrzyma obiekt, którynie b�dzie ulega� zmianom na skutek wys�anych mu wiadomo�ci.

Wsparcie dla automatycznego od�miecania kolekcji

0 $ gcc -c -framework Cocoa -fobjc-gc-only collected.m 1 $ gcc -c -framework Cocoa -fobjc-gc collected.m

Od wersji OS X 10.5 firma Apple wprowadzi�a do Objective-C automatyczne od-�miecanie kolekcji. Cho� mo�e to upraszcza� �ycie programistom, w wi�kszo�ciprzypadków zmniejsza wydajno��. Od�miecacz firmy Apple do �ledzenia istnie-j�cych referencji zu�ywa du�o pami�ci i z tego powodu nie jest dost�pny na iPhone’a.Nie jest te� obs�ugiwany w starszych wersjach OS X, a jego obs�uga w GNUstepjest ograniczona. Je�li chcesz pisa� przeno�ny kod, powiniene� unika� od�miecaniakolekcji.

Je�li skompilujesz kod w trybie od�miecania pami�ci, wszystkie wiadomo�ci–retain, –release i –autorelease zostan� zignorowane. Kompilator automatyczniewstawi wywo�ania odpowiednich funkcji przy ka�dej operacji zapisu do pami�cina stercie.

Page 21: Objective-C. Leksykon profesjonalisty - Helionpdf.helion.pl/objclp/objclp.pdf · 2019-05-15 · Objective-C na poziomie jzyka nie pozwala na alokacj lub dealokacj obiek-tów. Jest

Wsparcie dla automatycznego od�miecania kolekcji 63

�eby mo�na by�o u�ywa� od�miecania kolekcji, kod musi by� skompilowany w try-bie od�miecania pami�ci. Przy ka�dej operacji przypisania do pami�ci na sterciewstawiane s� wtedy wywo�ania funkcji, które w �rodowisku uruchomieniowymsystemu Mac s� zadeklarowane w pliku objc-auto.h.

Funkcje te upewniaj� si�, �e od�miecacz kolekcji jest �wiadomy wykonanegoprzypisania. S� wymagane, bo od�miecacz dzia�a w tle, w osobnym w�tku, usu-waj�c obiekty, do których nie mo�e znale�� referencji. Od�miecacz musi by� in-formowany o przestawianiu wska�ników; móg�by przez przypadek usun�� obiekt,do którego przed momentem utworzy�e� referencj�.

Podczas kompilacji z w��czonym od�miecaniem pami�ci dost�pne s� dwie opcje. Poskompilowaniu z flag� –fobjc-gc-only kod b�dzie wspiera� wy��cznie od�miecaniekolekcji. Po skompilowaniu z flag� –fobjc-gc kod b�dzie obs�ugiwa� zarównozliczanie referencji, jak i automatyczne od�miecanie kolekcji. Jest to u�yteczne, gdykompilujesz framework. Wci�� musisz pami�ta�, by w odpowiednich miejscachdoda� wywo�ania –retain i –release, ale u�ytkownicy frameworku b�d� mogliu�ywa� go z w��czonym lub wy��czonym od�miecaniem.

110 OBJC_EXPORT BOOL objc_atomicCompareAndSwapGlobal( id predicate, id replacement, volatile id * objectLocation)111 __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_NA) OBJC_ARC_UNAVAILABLE;112 OBJC_EXPORT BOOL objc_atomicCompareAndSwapGlobalBarrier(id predicate, id replacement, volatile id * objectLocation)113 __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_NA) OBJC_ARC_UNAVAILABLE;114 // automatyczna aktualizacja zmiennej instancyjnej115 OBJC_EXPORT BOOL objc_atomicCompareAndSwapInstanceVariable(id predicate, id replacement, volatile id * objectLocation)116 __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_NA) OBJC_ARC_UNAVAILABLE;117 OBJC_EXPORT BOOL objc_atomicCompareAndSwapInstanceVariableBarrier (id predicate, id replacement, volatile id * objectLocation)

Page 22: Objective-C. Leksykon profesjonalisty - Helionpdf.helion.pl/objclp/objclp.pdf · 2019-05-15 · Objective-C na poziomie jzyka nie pozwala na alokacj lub dealokacj obiek-tów. Jest

64 Rozdzia� 3 � Zarz�dzanie pami�ci�

Wspó�praca z CW trybie od�miecania pami�ci nie jest skanowana ca�a pami��. Dane zaalokowaneprzy u�yciu malloc() s� niewidoczne dla od�miecacza. Je�li przeka�esz do funk-cji z C wska�nik na obiekt w parametrze void*, a nast�pnie funkcja przechowa gow pami�ci zarezerwowanej malloc(), stanie si� niewidoczny dla od�miecacza i mo�ezosta� zwolniony, cho� wci�� istniej� do niego referencje.

W trybie ARC kompilator automatycznie zajmie si� wska�nikami na stosie i zmien-nymi instancyjnymi, ale nie b�dzie �ledzi� wska�ników w strukturach i wszystkichinnych jawnie zadeklarowanych jako __unsafe_uretained.

Normalnie przed wstawieniem obiektu na stert� wys�a�by� mu wiadomo�� –retain.Nie dzia�a to jednak w trybie od�miecania pami�ci i jest zabronione w trybieARC. W zamian musisz u�y� funkcji CFRetain(), inkrementuj�cej licznik refe-rencji obiektu niezale�nie od obecno�ci od�miecacza. Od�miecacz zwolni obiekt je-dynie wtedy, gdy licznik referencji osi�gnie warto�� zero i nie b�dzie mo�na zna-le�� do niego �adnej referencji w skanowanej pami�ci.

Gdy skoczysz prac� z referencj� znajduj�c� si� poza obszarem �ledzonym przezod�miecacz, b�dziesz musia� wywo�a� CFRelease().

ARC posiada bogatszy model pami�ci do tego typu operacji. Jawne rzutowaniaobiektów na nieobiektowe wska�niki nie s� ju� dozwolone. Musz� by� zast�pionerzutowaniami mostkowanymi. Rozwa�my nast�puj�cy fragment kodu dzia�aj�cyw trybie innym ni� ARC:

void *aPointer = (void*)someObject;

W trybie ARC rezultatem wykonania go by�oby utworzenie ze wska�nika �ledzo-nego wska�nika nie�ledzonego. Nie jest to zamiana, któr� chcia�by� wykona� bezzastanowienia. Masz trzy podstawowe mo�liwo�ci. Pierwsza jest cz�sto wykorzy-stywana w przypadku zmiennych na stosie lub wska�ników pokazuj�cych naobiekty, co do których ma si� pewno��, �e wskazuj� na nie inne referencje:

void *aPointer = (__bridge void*)someObject;

Powy�ej wykonywane jest rzutowanie bez przekazania w�asno�ci. Je�li wszystkiepozosta�e referencje na someObject przestan� istnie�, aPointer zostanie wisz�cymwska�nikiem.

Je�li wska�nik void* b�dzie umieszczony na stosie z zamiarem przechowania w�a-sno�ciowej referencji do obiektu, powiniene� wykona� rzutowanie mostkowane:

void *aPointer = (__bridge_retained void*) someObject;

Page 23: Objective-C. Leksykon profesjonalisty - Helionpdf.helion.pl/objclp/objclp.pdf · 2019-05-15 · Objective-C na poziomie jzyka nie pozwala na alokacj lub dealokacj obiek-tów. Jest

Niszczenie obiektów 65

Spowoduje to wyj�cie jednej referencji w�asno�ciowej spod kontroli ARC. Jest toz grubsza odpowiednik wys�ania do someObject wiadomo�ci –retain przed prze-chowaniem go we wska�niku. Je�li napiszesz (__bridge_retained void*)someObjectbez operacji przypisania, b�dzie to informacja dla kompilatora, �eby pozyska� re-ferencj� na obiekt. Tego typu post�powanie uznawane jest za bardzo z�y styl pro-gramowania. Podczas rzutowania z powrotem na wska�nik na obiekt powiniene�wykona� odwrotn� operacj�:

id anotherObjectPointer = (__bridge_transfer id)aPointer;aPointer = NULL;

Kod ten powoduje przekazanie w�asno�ciowej referencji pod kontrol� ARC. ARC jestteraz odpowiedzialny za zwalnianie obiektu, wi�c wa�ne jest pami�tanie o wy-zerowaniu wska�nika z C. Je�li nie przejmujesz w�asno�ci nad wska�nikiem, po-winiene� u�y� prostego rzutowania __bridge.

Niszczenie obiektów

3 @interface Example : NSObject 4 { 5 void *cPointer; 6 id objectPointer; 7 } 8 @end 9 @implementation Example10 - (void)finalize11 {12 if (NULL != cPointer) { free(cPointer); }13 [super finalize];14 }15 - (void)dealloc16 {17 if (NULL != cPointer) { free(cPointer); }18 #if !__has_feature(objc_arc)19 [objectPointer release];20 [super dealloc];21 #endif22 }23 @end

Z pliku: dealloc.m

Istniej� trzy metody wywo�ywane podczas niszczenia obiektu zale�nie od wyko-rzystywanego trybu. Jedna jest uruchamiana za ka�dym razem, ale nie mo�e by�napisana przez Ciebie. Metoda –.cxx_destruct jest zawsze wywo�ywana przez

Page 24: Objective-C. Leksykon profesjonalisty - Helionpdf.helion.pl/objclp/objclp.pdf · 2019-05-15 · Objective-C na poziomie jzyka nie pozwala na alokacj lub dealokacj obiek-tów. Jest

66 Rozdzia� 3 � Zarz�dzanie pami�ci�

�rodowisko uruchomieniowe Objective-C i zajmuje si� niszczeniem pól, za któ-rych czyszczenie jest odpowiedzialny kompilator. Do kategorii tej nale�� obiektyC++ w trybie Objective-C++ i wska�niki na obiekty Objective-C w trybie ARC.

Dwie pozosta�e metody to –finalize i –dealloc. W trybie od�miecania pami�cinie musisz nic robi�, by usun�� referencje do obiektów Objective-C, ale wci��musisz wykona� czyszczenie zasobów, którymi nie zarz�dza od�miecacz pami�ci.Do tej kategorii nale�y zamykanie uchwytów do plików, zwalnianie pami�ci za-alokowanej przy u�yciu malloc() itd. Je�li klasa ma zmienne instancyjne, którewymagaj� r�cznego czyszczenia, powiniene� zadeklarowa� metod� –finalize.

Od�miecacz pami�ci zwykle wywo�a metody –finalize w specjalnymw�tku. Oznacza to, �e metody –finalize musz� by� bezpieczne zewzgl�du na w�tki. Je�li korzystaj� z globalnych zasobów, musz� upew-ni� si�, �e nie spowoduje to problemów.

Je�li nie u�ywasz od�miecania pami�ci, sprz�tanie powiniene� wykona� w metodzie–dealloc. Zawarto�� metody zale�y od tego, czy u�ywasz ARC. Dawniej metody –dealloc by�y wype�nione wiadomo�ciami –release wysy�anymi do ka�dejzmiennej instancyjnej, któr� deklarowa�a klasa. Je�li korzystasz z ARC, niejest to wymagane. ARC zwolni wszystkie w�asno�ciowe referencje do obiektóww –.cxx_destruct, wi�c w –dealloc b�dziesz musia� sprz�tn�� jedynie zmienne in-stancyjne nieb�d�ce obiektami.

Zarówno w trybie od�miecania pami�ci, jak i r�cznego pozyskiwania i zwalniania re-ferencji powiniene� przekaza� wiadomo�� do nadklasy, wywo�uj�c [super dealloc]lub [super finalize]. W trybie ARC jawne wywo�anie –dealloc jest niedozwolone.Zamiast tego ARC sam wstawi wywo�anie [super dealloc] na kocu metody–dealloc w ka�dej klasie nieb�d�cej korzeniem.

Zwró� uwag�, �e kod na pocz�tku tego podrozdzia�u jest nadmiernie skompliko-wany. W prawdziwym kodzie ma�o prawdopodobne jest, �eby� musia� wspiera�zarówno tryb ARC, jak i tryb r�cznego pozyskiwania i zwalniania referencji.Tryby te mog� wspó�istnie� w jednym programie, ale jedynym rozs�dnym powo-dem wspierania jakiegokolwiek trybu poza ARC jest ch�� zachowania zgodno�cize starymi kompilatorami.

S�abe referencje

4 __weak id weak; 5 6 int main(void) 7 {

Page 25: Objective-C. Leksykon profesjonalisty - Helionpdf.helion.pl/objclp/objclp.pdf · 2019-05-15 · Objective-C na poziomie jzyka nie pozwala na alokacj lub dealokacj obiek-tów. Jest

S�abe referencje 67

8 id obj = [NSObject new]; 9 weak = obj;10 obj = nil;11 objc_collect(OBJC_FULL_COLLECTION);12 fprintf(stderr, "S�aba referencja: %p\n", weak);13 return 0;14 }

Jednym z najprzyjemniejszych elementów implementacji od�miecania pami�cifirmy Apple jest istnienie zeruj�cych si�, s�abych referencji. Niepozyskane wska�nikis� w starej dokumentacji Objective-C cz�sto okre�lane mianem „s�abych”. Wska�nikite mog� przetrwa� d�u�ej ni� obiekt, na który wskazuj�. Niestety nie ma automa-tycznego sposobu sprawdzania, czy s� wci�� poprawne.

S�abe referencje okaza�y si� tak przydatne podczas od�miecania pami�ci, �e s�teraz wspierane tak�e przez ARC, cho� maj� odrobin� inne znaczenie. ImplementacjeARC zachowuj�ce wsteczn� kompatybilno�� nie obs�uguj� s�abych referencji,wi�c wsparcie firmy Apple jest obecnie jedynie na platformach OS X 10.7 i iOS 5lub pó�niejszych.

S�abe referencje w �rodowisku zliczania referencji s� cz�sto u�ywanedo eliminowania cykli. Nie jest to konieczne w �rodowisku, w którymreferencje s� �ledzone. W tym przypadku w miejscach potencjalnegotworzenia cykli oraz w trakcie tworzenia delegat mo�esz u�ywa� sil-nych referencji.

Je�li zadeklarujesz wska�nik na obiekt ze s�owem __weak, utworzysz zeruj�c� si�,s�ab� referencj�. Od�miecacz pami�ci nie we�mie jej pod uwag� podczas ustalania,czy obiekt wci�� istnieje, a w trybie ARC po przypisaniu do niej nie zostanie zwi�k-szony licznik referencji. Je�li wszystkie referencje do obiektu s� s�abe, mo�e onby� zniszczony. Po tej operacji wszystkie s�abe referencje b�d� zwraca�y nil.

S�abe referencje s� zwykle u�ywane w po��czeniu z konstrukcjami takimi jakpowiadomienia. S�ab� referencj� do obiektu mo�na przechowywa� i wysy�a� muwiadomo�ci tak d�ugo, jak d�ugo kto� inny posiada do niego referencj�. Gdy refe-rencja przestanie istnie�, obiekt mo�na automatycznie usun�� z mechanizmu po-wiadamiania.

Cocoa posiada teraz kolekcje pozwalaj�ce na przechowywanie s�abych referencji.Starsze wersje frameworku Foundation zawiera�y typy utworzone w j�zyku C:NSMapTable oraz NSHashTable wraz z zestawem funkcji C, które mo�na z nimi wyko-rzysta�. Interfejsy te s� wci�� dost�pne, ale w wersji 10.5 Apple zamieni�o te typyna klasy.

Page 26: Objective-C. Leksykon profesjonalisty - Helionpdf.helion.pl/objclp/objclp.pdf · 2019-05-15 · Objective-C na poziomie jzyka nie pozwala na alokacj lub dealokacj obiek-tów. Jest

68 Rozdzia� 3 � Zarz�dzanie pami�ci�

Typ NSMapTable jest ogólniejsz� form� NSDictionary. Mo�na w nim przechowy-wa� dowolne typy o rozmiarze wska�nika zarówno w kluczach, jak i warto�ciach.W trybie od�miecania pami�ci mo�esz wykorzystywa� t� klas� do przecho-wywania mapowa z i do silnych lub s�abych wska�ników. Jest to przydatnenp. w NSNotificationCenter, w którym przechowuje si� obiekty mog�ce otrzymywa�powiadomienia. Gdy obiekty te przestan� istnie�, s� automatycznie usuwane z ko-lekcji, a powiadomienia nie s� ju� wi�cej wysy�ane.

Przyk�ad na pocz�tku podrozdzia�u pokazuje wa�n� ró�nic� mi�dzy trybami ARCi od�miecania pami�ci. Je�li skompilujesz i uruchomisz go z w��czonym od�mie-caniem pami�ci, wypisany zostanie przypuszczalnie adres obiektu. Jest tak, gdy�od�miecacz pami�ci podczas skanowania stosu wci�� widzi stare warto�ci tym-czasowe.

W odró�nieniu od od�miecacza pami�ci w trybie ARC zawsze zostanie wypisanawarto�� 0. ARC jest zupe�nie deterministyczny. Przypisanie nil do silnego wska�nikadekrementuje licznik referencji obiektu i powoduje dealokacj�. S�aby wska�nikjest zerowany, nim zacznie si� dealokacja, wi�c gwarantowane jest, �e przyjmiewarto�� zero, nim wywo�ana zostanie funkcja fprintf().

Alokowanie skanowanej pami�ci

15 id *buffer =16 NSAllocateCollectable(17 10 * sizeof(id),18 NSScannedOption);

Z pliku: gc.m

Pami�� zaj�ta przy u�yciu funkcji malloc() jest niewidoczna dla od�miecaczapami�ci. Mo�e to by� problemem, np. je�li potrzebujesz tablicy C zawieraj�cejobiekty. Widzieli�my ju� rozwi�zanie tego problemu. Mo�esz wywo�a� CFRetain()dla obiektu, który masz zamiar przechowa� w tablicy, oraz CFRelease() dla znaj-duj�cej si� w niej starej warto�ci, a nast�pnie je zamieni�.

Nie jest to idealne rozwi�zanie, ale dzia�a. Inn� opcj� jest alokacja fragmentu pa-mi�ci tak, by by� widoczny dla od�miecacza. Funkcja NSAllocateCollectable()jest podobna do malloc() z dwoma istotnymi ró�nicami.

Po pierwsze: zwracana przez ni� pami�� b�dzie od�miecana. Nie istnieje jej odpo-wiednik w postaci funkcji NSFreeCollectable(). Gdy ostatni wska�nik na buforzniknie, bufor zostanie usuni�ty.

Page 27: Objective-C. Leksykon profesjonalisty - Helionpdf.helion.pl/objclp/objclp.pdf · 2019-05-15 · Objective-C na poziomie jzyka nie pozwala na alokacj lub dealokacj obiek-tów. Jest

Alokowanie skanowanej pami�ci 69

Od�miecacz firmy Apple nie wspiera wska�ników do wn�trza bufora,wi�c musisz upewni� si�, �e utrzymujesz wska�nik na pocz�tek re-gionu. Inne wska�niki nie powstrzymaj� procesu usuni�cia go.

Drug� ró�nic� jest istnienie w tej funkcji drugiego parametru, definiuj�cego po-��dany typ pami�ci. Je�li chcesz u�ywa� bufora do przechowywania typów C,mo�esz wstawi� tu zero. Je�li przeka�esz NSScannedOption, zwrócony bufor b�dzieprzeszukiwany jako mo�liwe �ród�o wska�ników na obiekty oraz wska�ników nainne obszary pami�ci zwracane przez NSAllocateCollectable().

Page 28: Objective-C. Leksykon profesjonalisty - Helionpdf.helion.pl/objclp/objclp.pdf · 2019-05-15 · Objective-C na poziomie jzyka nie pozwala na alokacj lub dealokacj obiek-tów. Jest

70 Rozdzia� 3 � Zarz�dzanie pami�ci�

Page 29: Objective-C. Leksykon profesjonalisty - Helionpdf.helion.pl/objclp/objclp.pdf · 2019-05-15 · Objective-C na poziomie jzyka nie pozwala na alokacj lub dealokacj obiek-tów. Jest

Skorowidz

Aabstrakcyjna nadklasa, 82adres URL, 213aktywna p�tla wykonania, 211algebraiczny system typów, 17aplikacje Cocoa, 146ARC, 54, 57archwizowanie obiektów, 74arytmetyka sta�opozycyjna, 89ASCII, 98atrybuty pliku, 170automatyczne

obudowywanie,auto-boxing, 150

od�miecanie kolekcji, 62zliczanie referencji, 53zwalnianie pami�ci, 60

BBerkley Sockets API, 205bezkosztowa obs�uga

wyj�tków, 156biblioteka

GNUstep Base, 25libdispatch, 195libobjc, 18

blok@finally, 161@try, 161

bloki, 49, 116b��d w kodzie, 164b��dy, 155

CChisnall David, 9ci�g formatuj�cy, 103ci�g znakowy

dzielenie, 101kodowanie, 98kopiowanie, 101porównywanie, 94przetwarzanie, 96przycinanie, 100tworzenie, 94, 103wzorce, 105

Clang, 22, 23cykl, 57

Ddata, 125data odniesienia, 124debuger

GNU, 215LLVM, 216

deklarowanieklas, 31typów, 26

delegowanie, 79DNS-SD, 207dodawanie metod, 36dodawanie zmiennych, 232domena, 164

Local, lokalne, 176Network, sie�, 176

System, 176User, u�ytkownik, 176

domenysystemu plików, 175ustawie, 136

domkni�cie, 189dost�p do warto�ci, 147dwufazowe tworzenie

obiektów, 71dyrektywa

@encode(), 48@implementation, 37@selector(), 31@synthesize, 42

dziedziczenie z kolekcji, 118dzielenie ci�gów

znakowych, 101

Eenumerator, 115Erlang, 155

Ffirma NeXT, 25format

JSON, 134OpenStep, 133

frameworkApplication Kit, 19Cocoa, 18Foundation Kit, 19, 51

Page 30: Objective-C. Leksykon profesjonalisty - Helionpdf.helion.pl/objclp/objclp.pdf · 2019-05-15 · Objective-C na poziomie jzyka nie pozwala na alokacj lub dealokacj obiek-tów. Jest

236 Skorowidz

funkcja_ autoreleasePoolPush(),

60_Block_copy(), 50, 193_Block_release(), 193_start, 142alarm(), 128asprintf(), 59, 103CFRetain(), 64class_conforms�ToProtocol(), 229

dispatch_get_global_�queue(), 196

ETGetOptionsDictionary(),143

exit(), 145fprintf(), 68free(), 59getaddrinfo(), 207getCounter(), 49, 50getopt(), 143gettimeofday(), 126longjmp(), 156main(), 47malloc(), 59memcpy(), 73NSAllocateCollectable(),

68NSClassFromString(), 230NSLog(), 104, 221objc_autorelease�PoolPop(), 60

objc_exception_throw(),219

objc_msg_lookup(), 217objc_msgSend(), 217, 224objc_release(), 53objc_retain(), 53object_getClass(), 45object_getIndexedIvars(),

232object_setClass(), 45printf(), 91, 103qsort(), 31scanf(), 91sprintf(), 59, 91sscanf(), 91strsep(), 101strtok(), 101

strtok_r(), 101time(), 124writeBack(), 55

funkcjeanonimowe, 49, 189konwertuj�ce, 99

GGCC, 46GNUstep runtime, 22

Hhierarchia NSControl, 80

Iinicjalizacja statyczna, 46inspekcja obiektów, 215Instance Method Pointer, 28instancja

NSDecimalNumber, 89NSFont, 107singletonu, 82

interfejs kqueue(), 206ivar, 33ivars, 26, 52, 232

Jjednostka zarz�dzania

pami�ci�, 168j�zyk

Smalltalk, 17StrongTalk, 17

JSON, JavaScript ObjectNotation, 134

Kkalendarz, 125kanoniczne ustawienia

regionalne, 91, 96kategorie, 36, 139klasa

LKMessageSend, 77NSApplication, 128NSArray, 110NSAssertionHandler, 220NSAttributedString,

106, 107

NSCalendar, 125NSDate, 124, 125NSDateFormatter, 126NSDecimal, 89NSDictionary, 148NSDistantObject, 209NSError, 164NSException, 159, 219NSFileHandle, 206, 207NSFileManager, 169, 170NSIndexSet, 111NSMutableArray, 111NSNotificationQueue, 201NSProcessInfo, 141NSPropertyList�Serialization, 132

NSRecursiveLock, 182NSRegularExpression, 105NSRunLoop, 128NSScanner, 92, 127NSSet, 112, 117NSThread, 180NSTimer, 84, 128NSURLConnection, 213NSURLRequest, 213NSUserDefaults, 136, 137NSView, 80Pair, 82TypedArray, 119UIApplication, 128

klastry klas, 82, 86, 96klasy

inspekcja, 229odszukiwanie, 228odszukiwanie wed�ug

nazwy, 224tworzenie, 231

kodowanieklucz-warto��, 114, 147tekstu, 99typów, 47typu, 48typu Objective-C, 86UTF-8, 93

kolejka FIFO, 196kolekcje, 109kompilator GCC, 23kompilowanie programów, 23

Page 31: Objective-C. Leksykon profesjonalisty - Helionpdf.helion.pl/objclp/objclp.pdf · 2019-05-15 · Objective-C na poziomie jzyka nie pozwala na alokacj lub dealokacj obiek-tów. Jest

Skorowidz 237

konstrukcja@autoreleasepool, 60

konwersja ci�gu znakowego,90

kopiowanie obiektów, 72KVC, key-value coding, 147,

151KVO, key-value observing,

147, 152kwalifikator

__block, 191static, 192

Llibrary, biblioteka, 176liczba argumentów, 103liczba binarna, 89licznik referencji, 102licznik referencji obiektu, 52linia komend, 143Lisp, 155lista z przeskokami,

skip list, 110listy w�a�ciwo�ci,

103, 129, 203

��apanie wyj�tków, 157��czenie si� z serwerami, 207

Mmakro

assert(), 220CFSTR(), 94NS_BLOCK_ASSERTS,

221NSAssert(), 220NSCAssert(), 220

mapa, 113mechanizm powiadomie, 199mechanizm wi�zania, 152metaklasy, 231metoda

+alloc, 72+allocWithZone, 79+bundleForClass, 175+initialize, 47

+pathWithComponents,172

+stringWithFormat, 90–addToQueue, 186–compare, 96-countForObject, 113–dealloc, 58–description, 103–descriptionWithLocale, 90–fileExistsAtPath:is�Directory, 173

–finalize, 66–forward, 227–hash, 112–init, 72–initWithCoder, 76–initWithString, 139–isEqualToString, 95KVC, 148–lastIndex, 111–makeObjects�PerformSelector, 116

malloc(), 51–member, 117–newCopyStarted, 204–objectForKey, 136, 148–pathComponents, 172–pathForResource:of�Type, 174

–readUTF8String, 207–setDateFormat, 127–setStringValue, 62–setValue:forKey, 148sprintf(), 90–start, 128–stringValue, 139–valueForKey, 148–writeUTF8String, 207

metodyo zmiennej liczbie

argumentów, 110wirtualne, 120

migracja, 58MMU, memory

management unit, 168model obiektowy, 15multicast DNS, 211

Nnadklasa

NSObject, 33NSProxy, 33

nag�e zakoczenieprogramu, 145

narz�dziedo migracji, 58gnustep-config, 24pbxbuild, 24plutil, 134

NeXT, 20niszczenie obiektów, 65notacja kropkowa, 39, 151

Oobiekt

naprawiaj�cy, 165NSAutoreleasePool, 104NSCharacterSet, 92, 100NSColor, 138NSLocale, 144self, 61

obiekty ci�gów znakowych, 93obserwacja klucz-warto��, 147obs�uga bloków, 189obs�uga wyj�tków, 157odczytywanie pliku, 167od�miecanie kolekcji, 63opakowywanie, boxing, 86opcja copy, 41opcja –framework, 24OpenStep, 98OS X GCC, 23

Ppakiety, bundles, 174p�tla wykonania, 84, 128p�tla wykonania

NSRunLoop, 60platforma POWER6, 89plik example.plist, 130pliki implementacji, 32pliki nag�ówkowe, 32POD, plain old data type, 122

Page 32: Objective-C. Leksykon profesjonalisty - Helionpdf.helion.pl/objclp/objclp.pdf · 2019-05-15 · Objective-C na poziomie jzyka nie pozwala na alokacj lub dealokacj obiek-tów. Jest

238 Skorowidz

podklasaNSEnumerator, 115

NSNumber, 90NSObject, 38NSSet, 113NSString, 83

podmiana wska�nika isa,154, 232

POSIX, 142, 179powiadomienia

kolejkowanie, 201przesy�anie, 202wysy�anie, 201��danie, 199

priorytet pliku, 175priorytet w�tku, 180proces przestrzeni pracy, 167programowanie sterowane

zdarzeniami, 84projekt GNU, 20protoko�y nieformalne, 226protokó�

Collection, 37ETCollection, 37NSCoding, 76, 139NSCopying, 50, 73NSLocking, 185NSObject, 35, 116TCP/IP, 205

przechowywaniekolekcji, 130obiektów, 120, 138ustawie, 135

przedwczesnaoptymalizacja, 95

przejrzysta wersja, 135przesy�anie obiektów, 208pseudozmienna super, 43punkt zatrzymania,

breakpoint, 218

QQTKit, 123

Rreferencje niew�asno�ciowe, 52referencje w�asno�ciowe,

52, 61

Rhapsody DR2, 175rozmiar wska�nika, 86rozszerzenie .h, 32rozszerzenie .m, 32rozszerzenie klasy, 37rzucanie obiektów, 158rzutowanie

mostkowane, 64mostkowane __bridge, 58wska�ników, 16

Sscheduler, 181SEH, structured exception

handling, 156selektory, 30selektory typowane, 31Simula, 16singletony, 78skojarzone referencje, 233skrót obiektu, 112s�abe referencje, 67s�ownik, 113

NSDictionary, 159w�tku, 184

s�owo kluczowe, 158@defs, 44@end, 32@implementation, 32@interface, 32, 33@private, 33@protocol(), 35@public, 33@synthesize, 42__block, 49__thread, 184__unsafe_unretained, 57__weak, 57_cmd, 42const, 27nonatomic, 40self, 42s�ownik, 184struct, 26super, 43this, 42throw, 160

Smalltalk, 25, 155stoper, 128

StrongTalk, 17struktura NSRange, 18strukturalna obs�uga

wyj�tków, 156system

OPENSTEP, 146OS X, 22, 24OS X 10.7, 23Solaris, 19Symbian, 22

systemy plików, 173szybkie enumerowanie,

97, 115

��cie�ki do klucza, 151�rodowisko uruchomieniowe

GNU, 224GNUstep, 22

Ttablica asocjacyjna, 113tablice, 111test Ingallsa, 18TLB, 195tryb

ILP32, 85LP64, 85

tworzenieklas, 231s�ownika, 113w�tków, 179w�asnych kolejek, 196

typClass, 27IMP, 28long, 86NSDecimal, 89NSMapTable, 68NSString*, 34NSTimeInterval, 123readwrite, 40SEL, 27, 31unichar, 93

typypodstawowe, 85wbudowane, 85zmiennoprzecinkowe, 85

Page 33: Objective-C. Leksykon profesjonalisty - Helionpdf.helion.pl/objclp/objclp.pdf · 2019-05-15 · Objective-C na poziomie jzyka nie pozwala na alokacj lub dealokacj obiek-tów. Jest

Skorowidz 239

UURL, Uniform Resource

Locator, 212

Wwarto�� nil, 29, 225w�tki

rywalizacja, 181synchronizacja, 182

wczytywanie danych, 213w�z�y równoleg�e, 210wiadomo�ci

przekierowywanie, 227wysy�anie, 223

wiadomo��+alloc, 61, 72, 82+defaultCenter, 200+new, 71–autorelease, 58, 84–characterIsMember, 100–compare, 31–copy, 102–copyWithZone, 73–countForObject, 113–dealloc, 51–decimalNumberBy�Adding, 89

–decimalValue, 89–description, 103–drain, 60–forwardInvocation, 209–integerValue, 90–isEqual, 95, 112–isProxy, 45

–readDataOfLength, 169–release, 58, 60–retain, 58–retainCount, 52–stringForKey, 136–stringValue, 95–threadDictionary, 184–timeIntervalSinceDate,

126–UTF8String, 97–waitForDataInBackground�AndNotify, 206

wi�zania Cocoa, 151worek, bag, 113wska�nik, pointer, 86

isa, 44, 45, 50na metody instancyjne, 28na NSError*, 169na struktur�, 43void*, 64

wska�niki na obiekty, 26wyj�tki, 155

NSInternalConsistency�Exception, 220

z nawracaniem, resumableexceptions, 163, 165

wyra�enie @throw(), 162wysy�anie wiadomo�ci, 28

bez argumentów, 28do instancji, 28do klasy, 28do nil, 29do obiektu, 29

wyszukiwanie serwisówDNS, 211

wyznaczony inicjalizator, 77wzajemne wykluczanie,

muteks, 182wzorzec

delegacji, 56delegowania, 79fasady, 80modyfikowalnych

podklas, 27, 109singletonu, 169

YYellowBox, 175

Zzadeklarowane w�a�ciwo�ci,

39zapisywanie kolekcji, 130zdarzenia wywo�ywane

regularnie, 180zliczanie czasu, 126zmienne

instancyjne, instancevariables, 26, 232

przesuni�cia, offsetvariables, 33

�rodowiskowe, 142warunkowe, 185

znak*, 48@, 48^, 48

zwracanie zera, 163

Page 34: Objective-C. Leksykon profesjonalisty - Helionpdf.helion.pl/objclp/objclp.pdf · 2019-05-15 · Objective-C na poziomie jzyka nie pozwala na alokacj lub dealokacj obiek-tów. Jest

240 Skorowidz

Page 36: Objective-C. Leksykon profesjonalisty - Helionpdf.helion.pl/objclp/objclp.pdf · 2019-05-15 · Objective-C na poziomie jzyka nie pozwala na alokacj lub dealokacj obiek-tów. Jest