-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathThesis.lyx
More file actions
executable file
·6162 lines (5036 loc) · 140 KB
/
Thesis.lyx
File metadata and controls
executable file
·6162 lines (5036 loc) · 140 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
#LyX 2.0 created this file. For more info see http://www.lyx.org/
\lyxformat 413
\begin_document
\begin_header
\textclass ucthesisLyx
\use_default_options true
\maintain_unincluded_children false
\language ngerman
\language_package babel
\inputencoding auto
\fontencoding global
\font_roman default
\font_sans default
\font_typewriter default
\font_default_family default
\use_non_tex_fonts false
\font_sc false
\font_osf false
\font_sf_scale 100
\font_tt_scale 100
\graphics default
\default_output_format default
\output_sync 0
\bibtex_command default
\index_command default
\paperfontsize default
\spacing single
\use_hyperref false
\papersize a4paper
\use_geometry true
\use_amsmath 1
\use_esint 1
\use_mhchem 1
\use_mathdots 1
\cite_engine basic
\use_bibtopic false
\use_indices false
\paperorientation portrait
\suppress_date false
\use_refstyle 1
\index Index
\shortcut idx
\color #008000
\end_index
\secnumdepth 2
\tocdepth 2
\paragraph_separation indent
\paragraph_indentation default
\quotes_language english
\papercolumns 1
\papersides 1
\paperpagestyle default
\tracking_changes false
\output_changes false
\html_math_output 0
\html_css_as_file 0
\html_be_strict false
\end_header
\begin_body
\begin_layout Standard
\lang english
\begin_inset ERT
status open
\begin_layout Plain Layout
\backslash
thispagestyle{empty}
\end_layout
\begin_layout Plain Layout
\backslash
begin{center}
\end_layout
\begin_layout Plain Layout
\backslash
includegraphics[scale=0.3]{UniTrier.eps}
\end_layout
\begin_layout Plain Layout
\backslash
vspace{2 cm}
\end_layout
\begin_layout Plain Layout
{
\end_layout
\begin_layout Plain Layout
\backslash
Huge
\end_layout
\begin_layout Plain Layout
\backslash
bf
\end_layout
\begin_layout Plain Layout
Bachelorarbeit
\end_layout
\begin_layout Plain Layout
}
\end_layout
\begin_layout Plain Layout
\backslash
small
\end_layout
\begin_layout Plain Layout
\backslash
\backslash
zur Erlangung des akademischen Grades "Bachelor of Science" im Fach Informatik
\end_layout
\begin_layout Plain Layout
\backslash
vspace{1 cm}
\end_layout
\begin_layout Plain Layout
\backslash
Large
\end_layout
\begin_layout Plain Layout
\backslash
\backslash
Implementierung eines generischen Clients für iOS
\end_layout
\begin_layout Plain Layout
\backslash
\backslash
zur Analyse von REST-Services
\end_layout
\begin_layout Plain Layout
\backslash
normalsize
\end_layout
\begin_layout Plain Layout
\backslash
vspace{2.4 cm}
\end_layout
\begin_layout Plain Layout
\backslash
\backslash
Mario Stief
\end_layout
\begin_layout Plain Layout
\backslash
\backslash
geboren am 23.05.1981 in Trier
\end_layout
\begin_layout Plain Layout
\backslash
\backslash
eingereicht im Dezember 2012
\end_layout
\begin_layout Plain Layout
\backslash
vspace{2.4 cm}
\end_layout
\begin_layout Plain Layout
\backslash
\backslash
Betreuer:
\end_layout
\begin_layout Plain Layout
\backslash
\backslash
Prof.
Dr.
Peter Sturm
\end_layout
\begin_layout Plain Layout
\backslash
\backslash
Lehrstuhl für Systemsoftware und Verteilte Systeme
\end_layout
\begin_layout Plain Layout
\backslash
vspace{0.5 cm}
\end_layout
\begin_layout Plain Layout
\backslash
\backslash
Zweitgutachter:
\end_layout
\begin_layout Plain Layout
\backslash
\backslash
Prof.
Dr.
Stephan Diehl
\end_layout
\begin_layout Plain Layout
\backslash
\backslash
Lehrstuhl für Softwaretechnik
\end_layout
\begin_layout Plain Layout
\backslash
end{center}
\end_layout
\begin_layout Plain Layout
\backslash
newpage
\end_layout
\begin_layout Plain Layout
\backslash
setcounter{page}{1}
\end_layout
\begin_layout Plain Layout
\backslash
renewcommand{
\backslash
contentsname}{Inhaltsverzeichnis}
\end_layout
\end_inset
\lang ngerman
\begin_inset CommandInset toc
LatexCommand tableofcontents
\end_inset
\end_layout
\begin_layout Chapter
Einleitung
\end_layout
\begin_layout Standard
Im Programmieralltag eines Informatikers an der Universität Trier beschäftigt
man sich hauptsächlich mit der plattformunabhängigen objektorientierten
Programmiersprache Java.
Sie eignet sich aufgrund ihrer Portabilität hervorragend als Einsteigersprache,
denn die für das Ausführen benötigte Laufzeitumgebung kann man sich für
nahezu jedes Betriebssystem herunterladen und installieren.
Eine Ausnahme bildet das mobile Betriebssystem iOS, für welches Apple die
Entwicklung einer Java Runtime nicht gestattet.
Maschinennähere Erfahrungen sammelt man in C++, welches auf dem prozeduralen
ANSI-C basiert, jedoch zahlreiche Erweiterungen in Hinblick auf die objektorien
tierte Programmierung bietet, seien es Möglichkeiten zur Datenkapselung,
Vererbung oder Polymorphie, um nur einige zu nennen.
Dazu wurden Sprachkonstrukte von C abgeändert, so dass manche C-Programme
angepasst werden müssen, um sich als C++-Programm übersetzen zu lassen.
Einen etwas anderen Ansatz geht Apple mit der Programmiersprache Objective-C,
welche ursprünglich als Basis für das Betriebssystem NextStep verwendet
wurde.
Mit der Übernahme durch Apple wurde die aus NextStep hervorgehende OpenStep-API
ebenfalls Grundlage für OS X, womit sich auch die Systemsprache von Pascal
auf Objective-C änderte.
Anders als C++ greift Objective-C für die objektorientierte Erweiterung
auf die Sprache Smalltalk zurück, in der mit Nachrichtenkommunikation gearbeite
t wird und es nur drei eingebaute ausführbare Konstrukte gibt: Eine Botschaft
wird an ein Objekt gesendet, einer Variable wird ein Objekt zugewiesen
oder ein Objekt wird als Rückgabewert einer Methode zurückgeliefert.
Die Smalltalk-Erweiterung ist von der gewöhnlichen C-Syntax strikt getrennt,
somit gibt es kein Problem, herkömmlichen C-Code zu übersetzen.
Dieser andersartige Ansatz macht neugierig, einmal selbst in die Tiefen
des auf Nachrichten basierenden C-Derivates abzutauchen und einen genaueren
Blick auf das Konzept hinter den vielen eckigen Klammern zu werfen, mit
denen sich ein in Objective-C geschriebenes Programm präsentiert.
Der TIOBE-Index, der seit 2001 ein monatlich aktualisiertes Ranking von
Programmiersprachen nach ihrer Popularität publiziert, listet Objective-C
hinter C und Java derzeit auf Platz 3 der am meisten verwendeten Programmierspr
achen.
\begin_inset Foot
status open
\begin_layout Plain Layout
TIOBE Programming Community Index for November 2012, Headline: Objective-C
on its way to become "language of the year" again
\end_layout
\end_inset
Die Tendenz: kontinuierlich steigend.
\begin_inset Foot
status open
\begin_layout Plain Layout
TIOBE Programming Community Index Objective-C
\end_layout
\end_inset
Diese Arbeit bietet eine attraktive Möglichkeit, sich im universitären
Rahmen in diesen Bereich einzuarbeiten und einen Blick über den Tellerrand
zu werfen.
Eine Möglichkeit, die ich hiermit gerne ergreifen möchte.
\end_layout
\begin_layout Standard
Für die Entwicklung auf seinen Systemen stellt Apple mit Xcode eine Entwicklungs
umgebung, die nach eigenen Angaben mächtig genug ist, dass sie von Apple
selbst zur Entwicklung von Betriebssystemen und Anwendungen eingesetzt
wird – und in den aktuellen Versionen angeblich eine sehr einfach zu erlernende
Oberfläche für den Entwurf der GUI mit sich bringt.
Neben der Entwicklung einer Anwendung für einen Apple Macintosh bietet
sich mit einer relativ neuen Technologie jedoch noch ein weiteres Stück
Hardware des Unternehmens aus Kalifornien an: Im Jahr 2010 landete mit
dem iPad die Sparte der “Post-PC”-Tablets im Mainstream-Bereich, die 2005
ihren ersten Kandidaten mit dem Nokia 770 Internet-Tablet hatte.
Diese Post-PCs waren keine herkömmlichen Notebooks mit Tastatur mehr, die
über für Stift-Bedienung ausgelegte Touchscreen verfügten, sie waren wesentlich
leichter und dünner, liefen mit eigenen, angepassten Betriebssystem und
verfügten über eine innovatives Bedienkonzept für Fingerberührungen – auch
wenn das beim Nokia 770 noch nicht der Fall war.
Auch heute liegt der Marktanteil von Apples iPad noch bei über 50 %
\begin_inset Foot
status open
\begin_layout Plain Layout
Der Apple-Marktanteil am Tablet-Markt betrug lt.
einer IDC-Pressemitteilung vom 5.
November 2012 50,4 %.
\end_layout
\end_inset
, so ist es sicherlich eine lohnende Erfahrung, den “Blick über den Tellerrand”
zusätzlich auf dieses neuartige Stück Hardware zu richten und eine Anwendung
zu schreiben, die auf Apples mobilem Betriebssystem iOS läuft.
\end_layout
\begin_layout Standard
Als Anwendungsbeispiel für diese ersten Schritte in einer neuen Umgebung
wird ein Client implementiert, der die Verbindung mit einem ebenfalls neuen
Bereich herstellt:
\shape italic
REST Services
\shape default
.
Die Abkürzung
\shape italic
REST
\shape default
steht für Representional State Transfer und ist ein Programmierparadigma
für Webanwendungen, welches im Grunde so alt ist wie das Internet selbst.
Dieser erst 2000 in einer Dissertation eingeführte Standard beschreibt
die Implementierung eines Webservices, mit dem die bereits im HTTP-Protokoll
definierten Methoden GET, PUT, POST, DELETE und HEAD auf statischen Inhalten
arbeiten.
Diese werden wiederum auf permanente URLs abgebildet.
Da die Funktionalität
\shape italic
REST
\shape default
-konformer Webservices immer auf diese HTTP-Methoden abgebildet wird, sollte
es möglich sein, einen generischen Client zu entwickeln, der mit all diesen
Webservices irgendwie eine gemeinsame Kommunikationsschnittstelle bildet.
Es sollen Anfragen gesendet und Antworten ausgewertet werden.
Diese Antworten bekommt man in der Regel im Format XML oder JSON zurückgeliefer
t.
Der Client sollte in der Lage sein, diese Daten zu analysieren, die potentielle
n Ressourcen darin zu erkennen, sie zu validieren und aufzubereiten und
dem Anwender eine einfache Möglichkeit bieten, mit diesen zu interagieren.
\end_layout
\begin_layout Standard
Auf dem Weg zum funktionsfähigen Client wird zunächst ein kurzer Einblick
in die Werkzeugkiste gegeben, mit der hier gearbeitet wird.
Es wird kurz die Programmiersprache Objective-C vorgestellt und einige
Eigenheiten aufgezeigt, die man in dieser Form so nicht in der Java- oder
C++-Welt findet.
Weiterhin wird die von Apple verwendete API Cocoa Touch vorgestellt und
die Entwicklungsumgebung Xcode, mit der auf diese zugegriffen wird.
Im nachfolgenden Kapitel wird auf die Schnittstelle mit der
\shape italic
REST
\shape default
-Welt eingegangen.
Es wird erklärt, was im Genauen unter einem
\shape italic
REST
\shape default
-kompatiblen Webservice zu verstehen ist und wie man mit diesem kommuniziert.
Den letzten größeren Bereich stellt die Implementierung der fertigen Software,
deren Funktionalität anhand genereller Abläufe beschrieben wird.
Weiter wird hier auf die Probleme, die sich während des Entwickelns dieser
Arbeit ergaben, näher eingegangen.
Abgerundet wird diese Arbeit durch einen reflektiven Abriss der vorhergegangen
Kapitel und einen persönlichen Ausblick darauf, ob die herausgearbeiteten
Erfahrungen den Ausflug in die Welt der Apple-Systeme beenden oder den
Grundstein bilden für weitere Entwicklungen auf den mobilen Systemen der
Kalifornier.
\end_layout
\begin_layout Chapter
Die Werkzeugkiste
\end_layout
\begin_layout Section
Basissprache: Objective-C
\end_layout
\begin_layout Standard
Das Entwickeln der ersten App für Apple-Hardware bringt die Herausforderung
mit sich, eine neue Programmiersprache erlernen zu müssen.
So wie Microsoft für sein .NET-Framework die C#-Sprache entwickelte, welche
Grundkonzepte der objektorientierten Hochsprachen C++, Java und Delphi
in sich vereint, so verwendet Apple für seine Systeme die Sprache Objective-C.
Anders als C# greift das in den frühen 80ern entwickelte Objective-C auf
das prozedurale ANSI-C zurück.
Seine objektorientierte Erweiterung kommt von Smalltalk und wird als solche
strikt von der C-Syntax getrennt.
Die syntaktisch wichtigsten Neuerungen sind wie bei anderen Erweiterungskonzept
en hauptsächlich die Verwendung von Klassen und Methodenaufrufen.
Analog kann dieser Ansatz dazu verwendet werden, aus Pascal und Javascript,
die beide von Haus aus über kein Klassenkonzept verfügen, die objektorientierte
n Erweiterungssprachen Objective-Pascal und Objective-J zu erzeugen.
\end_layout
\begin_layout Standard
Wie aus der C-Welt bekannt wird in einer Header-Datei mit der Endung .h das
Interface deklariert, die Implementierungen erfolgt in der dazugehörigen
.m-Datei, welche Objective-C- oder einfachen C-Code enthalten kann.
Aus Kompatibilitätsgründen lassen sich Implementierungen mit der Dateiendung
.mm anlegen, dieser darf explizit C++-Code enthalten, was die Weiterverwendung
von C++-Bibliotheken erlaubt.
Statt
\family typewriter
\size footnotesize
#include
\family default
\size default
sollte man bei Objective-C auf
\family typewriter
\size footnotesize
#import
\family default
\size default
zurückgreifen, da es sicher stellt, dass jede einzubindende Datei auch
nur höchstens einmal eingebunden wird.
(Siehe auch
\begin_inset CommandInset citation
LatexCommand cite
key "Learning Objective-C"
\end_inset
.)
\end_layout
\begin_layout Standard
In Objective-C werden keine Funktionen mehr mit Parametern aufgerufen.
Statt dessen verwendet man Objekte, die sich untereinander Nachrichten
senden und so miteinander kommunizieren.
Diese Nachrichten veranlassen ein Objekt eine Methode auszuführen.
Dieses Paradigma wird als Message Passings bezeichnet und unterscheidet
sich stark von der Art der Methodenaufrufe, die man C++ verwendet.
Es darf grundsätzlich jedes Objekt jede beliebige Nachricht an jedes Objekt
senden – oder auch an sich selbst, in dem Fall wird der Bezeichner self
verwendet – ganz gleich ob die Zielklasse oder eine beerbte Oberklasse
die passende Methode zu dieser Nachricht implementiert.
Da Methoden stets erst zur Laufzeit ermittelt werden und nicht bereits
beim Übersetzen, entscheidet sich erst beim Aufruf, wie ein Objekt auf
eine Nachricht reagieren wird.
Dieses Verfahren bezeichnet man daher auch als dynamisches Binden.
Im Gegensatz dazu werden die verwendeten C-Funktionen bereits beim Übersetzen
statisch gebunden.
Konsequenterweise existiert ebenfalls eine Methode, welche auf Nachrichten
reagiert, für die keine eigene Implementierung durch die Klasse bereitgestellt
wird.
Abstrakte Klassen kennt Objective-C übrigens nicht.
Jede Klasse muss vollständig implementiert werden, damit jederzeit Objekte
dieser Klasse erzeugt werden können.
Um dies zu umgehen lassen sich Protokolle deklarieren, in denen notwendige
Methoden unter dem
\family typewriter
\size footnotesize
@required
\family default
\size default
-Tag aufgelistet werden.
\end_layout
\begin_layout Standard
Wie in C++ lassen sich aus einer Klasse Objekte erzeugen.
Darüber hinaus ist aber jede Klasse auch selbst als Objekt ansprechbar.
Diese enthalten jedoch keine Member-Variablen und sind stets Singletons,
also Entwurfsmuster, die sicherstellen, dass von einer Klasse genau ein
Objekt existiert, welches global verfügbar ist.
Da ein solches Klassenobjekt ebenfalls für beliebige Nachrichten empfänglich
ist, erfolgt das Binden seiner Methoden auch erst zur Laufzeit.
Strings werden in Objective-C mit der Notation
\shape italic
@”…”
\shape default
erzeugt.
Ein solcher String ist ein Objekt vom Typ
\shape italic
NSString
\shape default
und als solcher ebenfalls in der Lage, Nachrichten zu empfangen.
Das vorangestellte
\shape italic
@
\shape default
ist ein Indikator für ein Objective-C-Objekt.
Wird es bei der Angabe des String weggelassen, wird der bekannte nullterminiert
e C-String erzeugt.
Per Vorgabe besitzen die Datentypen in Objective-C die gleiche Typisierung
wie in C: Sie sind
\shape italic
schwach
\shape default
,
\shape italic
statisch
\shape default
und
\shape italic
explizit
\shape default
.
Während eine
\shape italic
schwache
\shape default
Typisierung Auskunft darüber gibt, dass Dateitypen ineinander umgewandelt
werden können, weist das Merkmal
\shape italic
statisch
\shape default
darauf hin, dass der Datentyp bereits zur Übersetzungszeit geprüft wird.
Im Gegensatz dazu werden dynamische Datentypen erst zur Laufzeit getestet.
\shape italic
Explizit
\shape default
letztlich bedeutet, dass die Datentypen nicht erst per Typableitung ermittelt
werden.
Das Konzept der dynamischen Typisierung ist mit dem typlosen Datentyp
\shape italic
id
\shape default
umgesetzt, welcher einen Zeiger auf ein Objekt einer beliebigen Klasse
repräsentiert und an den jede beliebige Nachricht gesendet werden kann.
Ist für den tatsächlichen Typ dieses Objektes diese Methode jedoch unbekannt
oder möchte man eine typlose Variable an eine typgebundene Variable zuweisen,
deren Typen nicht übereinstimmen, so kommt es zu einem Laufzeitfehler.
(Siehe auch
\begin_inset CommandInset citation
LatexCommand cite
after "Kapitel 1.5.3 Nachrichten"
key "Galileo Computing"
\end_inset
.)
\end_layout
\begin_layout LyX-Code
\size footnotesize
id stringObject = @"Objective-C is great."; // OK
\end_layout
\begin_layout LyX-Code
\size footnotesize
NSString *string = stringObject; // OK
\end_layout
\begin_layout LyX-Code
\size footnotesize
NSNumber *number = stringObject; // logischer Fehler
\end_layout
\begin_layout LyX-Code
\size footnotesize
char character = [number charValue]; // Laufzeitfehler
\end_layout
\begin_layout Standard
Instanzobjekte einer Klasse werden durch das Senden einer entsprechenden
Nachricht an das zugehörige Klassenobjekt erzeugt.
Für gewöhnlich geschieht dies beim Programmstart, jedoch können im Gegensatz
zu C++ bei Objective-C jederzeit auch während der Laufzeit noch neue Objekte
erstellt werden.
Überladene Methoden, wie man sie in C++/Java kennt, findet man in Objective-C
nicht mehr.
Eine Nachricht an eine Methode besteht aus dem Selektor, der sich aus dem
Methodennamen und den Parametern zusammensetzt.
Das Laufzeitsystem sucht bei einer eingehenden Nachricht nach einer solchen
Methode und führt diese im Erfolgsfall aus.
Wird keine passende Methode lokalisiert, wird ein
\shape italic
nil
\shape default
zurückgeliefert.
Möchte man sich absichern, lässt sich das Objekt im Voraus fragen, ob es
eine bestimmte Nachricht versteht.
Diese Fähigkeit der Selbstkenntnis beinhaltet ebenfalls das Ermitteln der
eigenen Klasse und das Wissen, ob seine Klasse eine Unterklasse einer bestimmte
n anderen Klasse ist.
Der Begriff Reflexion sollte dem ein oder anderen ebenfalls aus der Java-/C++-W
elt bekannt sein.
\end_layout
\begin_layout LyX-Code
\size footnotesize
if([geometricFigure respondsToSelector:@selector(getShape)]) { ...
}
\end_layout
\begin_layout Standard
Dem Smalltalk-Erweiterungsanteil verdankt Objective-C die verwendete Notation
der eckigen Klammern, die ausdrückt, dass an dieser Stelle Nachrichten
versendet werden.
An erster Stelle wird das Empfängerobjekt genannt, anschließend folgt der
Selektor und gegebenenfalls der Parameter.
Sind Sender und Empfänger der Nachricht das gleiche Objekt, verwendet man
den Bezeichner
\shape italic
self
\shape default
.
\end_layout
\begin_layout LyX-Code
\size footnotesize
// somewhere lost in code:
\end_layout
\begin_layout LyX-Code
\size footnotesize
NSInteger age = [self computeAgeFromYear:1981 withMonth:5 andDay:23];
\end_layout
\begin_layout LyX-Code
\end_layout
\begin_layout LyX-Code
\size footnotesize
// method declaration:
\end_layout
\begin_layout LyX-Code
\size footnotesize
- (NSInteger)computeAgeFromYear:(NSInteger)birthyear
\end_layout
\begin_layout LyX-Code
\size footnotesize
withMonth:(NSInteger)month
\end_layout
\begin_layout LyX-Code
\size footnotesize
andDay:(NSInteger)day { ...
}
\end_layout
\begin_layout Standard
Diese Schreibweise ist für Neulinge äußerst gewöhnungsbedürftig, da hier
jeder Parameter eine explizite Benennung erfordert.
Methodennamen können in Objective-C durchaus sehr lang werden.
Hat man sich jedoch einmal daran gewöhnt, mag man diese Notation jedoch
nur ungern missen, denn sie fördert die Lesbarkeit und Verständlichkeit
des Codes ungemein.
Die obige Methode bezeichnet man vollständig als:
\shape italic
computeAgeFromYear:withMonth:andDay:
\shape default
, was auch gleichzeitig der Selektor dieser Methode ist.
Um einen anderen Selektor zu erstellen kann man den Datentyp
\shape italic
SEL
\shape default
nehmen:
\end_layout
\begin_layout LyX-Code
\family typewriter
\size footnotesize
SEL computeAge = @selector(computeAgeFromYear:withMonth:andYear:);
\end_layout
\begin_layout Standard
Das Minus-Präfix zu Beginn der oben stehenden Methode gibt an, dass es sich
hierbei um eine Instanzmethode handelt.
Das entspricht dem Verständnis einer Methode in C++/Java.
Da in Objective-C jedoch auch Klassen Objekte sind, können diese eigene
Methoden haben.
Solche Klassenmethoden werden durch ein vorangestelltes Plus gekennzeichnet.
Ein gutes Beispiel ist der zum Initialisieren gebräuchliche verkettete
Befehl
\family typewriter
\size footnotesize
[[NSObject alloc] init]
\family default
\size default
, der aus den folgenden Methoden besteht:
\family typewriter
\size footnotesize
+(id)alloc
\family default
\size default
ist die Klassenmethode, die Speicher für das Objekt reserviert und einen
Zeiger darauf zurückliefert.
Anschließend initialisiert sich das erzeugte Objekt in dem allokierten
Speicherbereich durch den Aufruf der Instanzmethode
\family typewriter
\size footnotesize
-(id)init
\family default
\size default
.
\end_layout
\begin_layout Subsection
Protokolle: Data Sources und Delegates
\end_layout
\begin_layout Standard
Ein Protokoll ist einem Interface in Java sehr ähnlich: Es deklariert die
Methoden, die in der Klasse vorhanden sein muss, die das Protokoll implementier
t.
Eine Protokolldeklaration beginnt mit dem Schlüsselwort
\family typewriter
\size footnotesize
@protocol
\family default
\size default
, die enthaltenen Methoden befinden sich entweder unter dem Tag
\family typewriter
\size footnotesize
@required
\family default
\size default
oder unter dem Tag
\family typewriter
\size footnotesize
@optional
\family default
\size default
.
Bei der Deklaration der Klasse wird das Protokoll in spitzen Klammern hinter
der Oberklasse angegeben, mehrere Protokolle werden durch Kommata voneinander
getrennt:
\end_layout
\begin_layout LyX-Code
\size footnotesize
@interface ViewController : UIViewController <UITextFieldDelegate,
\end_layout
\begin_layout LyX-Code
\size footnotesize
UITableViewDelegate, UITableViewDataSource> {
\end_layout
\begin_layout LyX-Code
\size footnotesize
...
\end_layout
\begin_layout LyX-Code
\size footnotesize
}
\end_layout
\begin_layout Standard
Ein Konzept, welches so ebenfalls nicht bei Java oder C++ anzutreffen ist,
sind die so genannten
\shape italic
Delegates
\shape default
(vom englischen delegation: Abordnung, Übertragung) und die
\shape italic
DataSources
\shape default
.
Mit ihnen ist es möglich, Nachrichten an ein delegiertes Objekt weiterzuleiten,
die in einen bestimmten Funktionalitätsbereich fallen.
Ein Textfeld sendet nach dem Betätigen der Eingabetaste die Nachricht
\shape italic
textFieldShouldReturn:(UITextField *)
\shape default
an ihre
\shape italic
Delegate
\shape default
.
Diese
\shape italic
Delegate
\shape default
kann die eigene Instanz sein oder aber ein beliebiges anderes Objekt, welches
das Protokoll
\shape italic
UITextFieldDelegate
\shape default
implementiert.
Die Implementation der Methode
\shape italic
textFieldShouldReturn
\shape default
gibt an, was beim Betätigen der Eingabetaste passieren soll.
An dieser Stelle bietet es sich beispielsweise an, mittels
\family typewriter
\size footnotesize
[textField resignFirstResponder]
\family default
\size default
das On-Screen-Keyboard wieder auszublenden und eine weitere Methode aufzurufen,
welche auf den im Textfeld enthaltenen Text zugreift.
Die ordnungsgemäße Durchführung wird mit einem zurückgegebenen
\shape italic
YES
\shape default
bestätigt.
\end_layout
\begin_layout Standard
Ein Objekt kann nicht nur als Empfänger von Nachrichten dienen, er kann
andersrum auch als Datenquelle fungieren.
Implementiert es das einer Programmstruktur zugehörige
\shape italic
DataSource
\shape default
-Protokoll, lässt es sich von dieser nutzen, um bei Laufzeit von dieser
benötigte Daten abzufragen.
\end_layout
\begin_layout Subsection
Properties
\end_layout
\begin_layout Standard
\shape italic
Properties
\shape default
werden in der Headerdatei deklariert und stellen einen einfachen Weg dar,
Accessoren zu implementieren.
War in früheren Xcode-Versionen noch das manuelle Synthetisieren mittels
\family typewriter
\size footnotesize
@synthesize
\family default
\size default
notwendig, werden diese durch die Deklaration eines
\shape italic
Property
\shape default
automatisch generiert.
Ein
\family typewriter
\size footnotesize
@property (UITextField*)name
\family default
\size default
erzeugt per default den Setter
\shape italic
setName
\shape default
sowie den Getter
\shape italic
name
\shape default
.
Möchte man die Variable
\shape italic
name
\shape default
setzen, werden zwei Möglichkeiten angeboten: Den C-basierten Weg oder die
nachrichtenbasierte Objective-C-Notation.
Ein
\family typewriter
\size footnotesize
_name.text = string
\family default
\size default
wird intern in ein
\family typewriter
\size footnotesize
[_name setText:NSString]