OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [doc/] [objc.texi] - Blame information for rev 711

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 711 jeremybenn
@c Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
2
@c 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2010
3
@c Free Software Foundation, Inc.
4
@c This is part of the GCC manual.
5
@c For copying conditions, see the file gcc.texi.
6
 
7
@node Objective-C
8
@comment  node-name,  next,  previous,  up
9
 
10
@chapter GNU Objective-C features
11
 
12
This document is meant to describe some of the GNU Objective-C
13
features.  It is not intended to teach you Objective-C.  There are
14
several resources on the Internet that present the language.
15
 
16
@menu
17
* GNU Objective-C runtime API::
18
* Executing code before main::
19
* Type encoding::
20
* Garbage Collection::
21
* Constant string objects::
22
* compatibility_alias::
23
* Exceptions::
24
* Synchronization::
25
* Fast enumeration::
26
* Messaging with the GNU Objective-C runtime::
27
@end menu
28
 
29
@c =========================================================================
30
@node GNU Objective-C runtime API
31
@section GNU Objective-C runtime API
32
 
33
This section is specific for the GNU Objective-C runtime.  If you are
34
using a different runtime, you can skip it.
35
 
36
The GNU Objective-C runtime provides an API that allows you to
37
interact with the Objective-C runtime system, querying the live
38
runtime structures and even manipulating them.  This allows you for
39
example to inspect and navigate classes, methods and protocols; to
40
define new classes or new methods, and even to modify existing classes
41
or protocols.
42
 
43
If you are using a ``Foundation'' library such as GNUstep-Base, this
44
library will provide you with a rich set of functionality to do most
45
of the inspection tasks, and you probably will only need direct access
46
to the GNU Objective-C runtime API to define new classes or methods.
47
 
48
@menu
49
* Modern GNU Objective-C runtime API::
50
* Traditional GNU Objective-C runtime API::
51
@end menu
52
 
53
@c =========================================================================
54
@node Modern GNU Objective-C runtime API
55
@subsection Modern GNU Objective-C runtime API
56
 
57
The GNU Objective-C runtime provides an API which is similar to the
58
one provided by the ``Objective-C 2.0'' Apple/NeXT Objective-C
59
runtime.  The API is documented in the public header files of the GNU
60
Objective-C runtime:
61
 
62
@itemize @bullet
63
 
64
@item
65
@file{objc/objc.h}: this is the basic Objective-C header file,
66
defining the basic Objective-C types such as @code{id}, @code{Class}
67
and @code{BOOL}.  You have to include this header to do almost
68
anything with Objective-C.
69
 
70
@item
71
@file{objc/runtime.h}: this header declares most of the public runtime
72
API functions allowing you to inspect and manipulate the Objective-C
73
runtime data structures.  These functions are fairly standardized
74
across Objective-C runtimes and are almost identical to the Apple/NeXT
75
Objective-C runtime ones.  It does not declare functions in some
76
specialized areas (constructing and forwarding message invocations,
77
threading) which are in the other headers below.  You have to include
78
@file{objc/objc.h} and @file{objc/runtime.h} to use any of the
79
functions, such as @code{class_getName()}, declared in
80
@file{objc/runtime.h}.
81
 
82
@item
83
@file{objc/message.h}: this header declares public functions used to
84
construct, deconstruct and forward message invocations.  Because
85
messaging is done in quite a different way on different runtimes,
86
functions in this header are specific to the GNU Objective-C runtime
87
implementation.
88
 
89
@item
90
@file{objc/objc-exception.h}: this header declares some public
91
functions related to Objective-C exceptions.  For example functions in
92
this header allow you to throw an Objective-C exception from plain
93
C/C++ code.
94
 
95
@item
96
@file{objc/objc-sync.h}: this header declares some public functions
97
related to the Objective-C @code{@@synchronized()} syntax, allowing
98
you to emulate an Objective-C @code{@@synchronized()} block in plain
99
C/C++ code.
100
 
101
@item
102
@file{objc/thr.h}: this header declares a public runtime API threading
103
layer that is only provided by the GNU Objective-C runtime.  It
104
declares functions such as @code{objc_mutex_lock()}, which provide a
105
platform-independent set of threading functions.
106
 
107
@end itemize
108
 
109
The header files contain detailed documentation for each function in
110
the GNU Objective-C runtime API.
111
 
112
@c =========================================================================
113
@node Traditional GNU Objective-C runtime API
114
@subsection Traditional GNU Objective-C runtime API
115
 
116
The GNU Objective-C runtime used to provide a different API, which we
117
call the ``traditional'' GNU Objective-C runtime API.  Functions
118
belonging to this API are easy to recognize because they use a
119
different naming convention, such as @code{class_get_super_class()}
120
(traditional API) instead of @code{class_getSuperclass()} (modern
121
API).  Software using this API includes the file
122
@file{objc/objc-api.h} where it is declared.
123
 
124
Starting with GCC 4.7.0, the traditional GNU runtime API is no longer
125
available.
126
 
127
@c =========================================================================
128
@node Executing code before main
129
@section @code{+load}: Executing code before main
130
 
131
This section is specific for the GNU Objective-C runtime.  If you are
132
using a different runtime, you can skip it.
133
 
134
The GNU Objective-C runtime provides a way that allows you to execute
135
code before the execution of the program enters the @code{main}
136
function.  The code is executed on a per-class and a per-category basis,
137
through a special class method @code{+load}.
138
 
139
This facility is very useful if you want to initialize global variables
140
which can be accessed by the program directly, without sending a message
141
to the class first.  The usual way to initialize global variables, in the
142
@code{+initialize} method, might not be useful because
143
@code{+initialize} is only called when the first message is sent to a
144
class object, which in some cases could be too late.
145
 
146
Suppose for example you have a @code{FileStream} class that declares
147
@code{Stdin}, @code{Stdout} and @code{Stderr} as global variables, like
148
below:
149
 
150
@smallexample
151
 
152
FileStream *Stdin = nil;
153
FileStream *Stdout = nil;
154
FileStream *Stderr = nil;
155
 
156
@@implementation FileStream
157
 
158
+ (void)initialize
159
@{
160
    Stdin = [[FileStream new] initWithFd:0];
161
    Stdout = [[FileStream new] initWithFd:1];
162
    Stderr = [[FileStream new] initWithFd:2];
163
@}
164
 
165
/* @r{Other methods here} */
166
@@end
167
 
168
@end smallexample
169
 
170
In this example, the initialization of @code{Stdin}, @code{Stdout} and
171
@code{Stderr} in @code{+initialize} occurs too late.  The programmer can
172
send a message to one of these objects before the variables are actually
173
initialized, thus sending messages to the @code{nil} object.  The
174
@code{+initialize} method which actually initializes the global
175
variables is not invoked until the first message is sent to the class
176
object.  The solution would require these variables to be initialized
177
just before entering @code{main}.
178
 
179
The correct solution of the above problem is to use the @code{+load}
180
method instead of @code{+initialize}:
181
 
182
@smallexample
183
 
184
@@implementation FileStream
185
 
186
+ (void)load
187
@{
188
    Stdin = [[FileStream new] initWithFd:0];
189
    Stdout = [[FileStream new] initWithFd:1];
190
    Stderr = [[FileStream new] initWithFd:2];
191
@}
192
 
193
/* @r{Other methods here} */
194
@@end
195
 
196
@end smallexample
197
 
198
The @code{+load} is a method that is not overridden by categories.  If a
199
class and a category of it both implement @code{+load}, both methods are
200
invoked.  This allows some additional initializations to be performed in
201
a category.
202
 
203
This mechanism is not intended to be a replacement for @code{+initialize}.
204
You should be aware of its limitations when you decide to use it
205
instead of @code{+initialize}.
206
 
207
@menu
208
* What you can and what you cannot do in +load::
209
@end menu
210
 
211
 
212
@node What you can and what you cannot do in +load
213
@subsection What you can and what you cannot do in @code{+load}
214
 
215
@code{+load} is to be used only as a last resort.  Because it is
216
executed very early, most of the Objective-C runtime machinery will
217
not be ready when @code{+load} is executed; hence @code{+load} works
218
best for executing C code that is independent on the Objective-C
219
runtime.
220
 
221
The @code{+load} implementation in the GNU runtime guarantees you the
222
following things:
223
 
224
@itemize @bullet
225
 
226
@item
227
you can write whatever C code you like;
228
 
229
@item
230
you can allocate and send messages to objects whose class is implemented
231
in the same file;
232
 
233
@item
234
the @code{+load} implementation of all super classes of a class are
235
executed before the @code{+load} of that class is executed;
236
 
237
@item
238
the @code{+load} implementation of a class is executed before the
239
@code{+load} implementation of any category.
240
 
241
@end itemize
242
 
243
In particular, the following things, even if they can work in a
244
particular case, are not guaranteed:
245
 
246
@itemize @bullet
247
 
248
@item
249
allocation of or sending messages to arbitrary objects;
250
 
251
@item
252
allocation of or sending messages to objects whose classes have a
253
category implemented in the same file;
254
 
255
@item
256
sending messages to Objective-C constant strings (@code{@@"this is a
257
constant string"});
258
 
259
@end itemize
260
 
261
You should make no assumptions about receiving @code{+load} in sibling
262
classes when you write @code{+load} of a class.  The order in which
263
sibling classes receive @code{+load} is not guaranteed.
264
 
265
The order in which @code{+load} and @code{+initialize} are called could
266
be problematic if this matters.  If you don't allocate objects inside
267
@code{+load}, it is guaranteed that @code{+load} is called before
268
@code{+initialize}.  If you create an object inside @code{+load} the
269
@code{+initialize} method of object's class is invoked even if
270
@code{+load} was not invoked.  Note if you explicitly call @code{+load}
271
on a class, @code{+initialize} will be called first.  To avoid possible
272
problems try to implement only one of these methods.
273
 
274
The @code{+load} method is also invoked when a bundle is dynamically
275
loaded into your running program.  This happens automatically without any
276
intervening operation from you.  When you write bundles and you need to
277
write @code{+load} you can safely create and send messages to objects whose
278
classes already exist in the running program.  The same restrictions as
279
above apply to classes defined in bundle.
280
 
281
 
282
 
283
@node Type encoding
284
@section Type encoding
285
 
286
This is an advanced section.  Type encodings are used extensively by
287
the compiler and by the runtime, but you generally do not need to know
288
about them to use Objective-C.
289
 
290
The Objective-C compiler generates type encodings for all the types.
291
These type encodings are used at runtime to find out information about
292
selectors and methods and about objects and classes.
293
 
294
The types are encoded in the following way:
295
 
296
@c @sp 1
297
 
298
@multitable @columnfractions .25 .75
299
@item @code{_Bool}
300
@tab @code{B}
301
@item @code{char}
302
@tab @code{c}
303
@item @code{unsigned char}
304
@tab @code{C}
305
@item @code{short}
306
@tab @code{s}
307
@item @code{unsigned short}
308
@tab @code{S}
309
@item @code{int}
310
@tab @code{i}
311
@item @code{unsigned int}
312
@tab @code{I}
313
@item @code{long}
314
@tab @code{l}
315
@item @code{unsigned long}
316
@tab @code{L}
317
@item @code{long long}
318
@tab @code{q}
319
@item @code{unsigned long long}
320
@tab @code{Q}
321
@item @code{float}
322
@tab @code{f}
323
@item @code{double}
324
@tab @code{d}
325
@item @code{long double}
326
@tab @code{D}
327
@item @code{void}
328
@tab @code{v}
329
@item @code{id}
330
@tab @code{@@}
331
@item @code{Class}
332
@tab @code{#}
333
@item @code{SEL}
334
@tab @code{:}
335
@item @code{char*}
336
@tab @code{*}
337
@item @code{enum}
338
@tab an @code{enum} is encoded exactly as the integer type that the compiler uses for it, which depends on the enumeration
339
values.  Often the compiler users @code{unsigned int}, which is then encoded as @code{I}.
340
@item unknown type
341
@tab @code{?}
342
@item Complex types
343
@tab @code{j} followed by the inner type.  For example @code{_Complex double} is encoded as "jd".
344
@item bit-fields
345
@tab @code{b} followed by the starting position of the bit-field, the type of the bit-field and the size of the bit-field (the bit-fields encoding was changed from the NeXT's compiler encoding, see below)
346
@end multitable
347
 
348
@c @sp 1
349
 
350
The encoding of bit-fields has changed to allow bit-fields to be
351
properly handled by the runtime functions that compute sizes and
352
alignments of types that contain bit-fields.  The previous encoding
353
contained only the size of the bit-field.  Using only this information
354
it is not possible to reliably compute the size occupied by the
355
bit-field.  This is very important in the presence of the Boehm's
356
garbage collector because the objects are allocated using the typed
357
memory facility available in this collector.  The typed memory
358
allocation requires information about where the pointers are located
359
inside the object.
360
 
361
The position in the bit-field is the position, counting in bits, of the
362
bit closest to the beginning of the structure.
363
 
364
The non-atomic types are encoded as follows:
365
 
366
@c @sp 1
367
 
368
@multitable @columnfractions .2 .8
369
@item pointers
370
@tab @samp{^} followed by the pointed type.
371
@item arrays
372
@tab @samp{[} followed by the number of elements in the array followed by the type of the elements followed by @samp{]}
373
@item structures
374
@tab @samp{@{} followed by the name of the structure (or @samp{?} if the structure is unnamed), the @samp{=} sign, the type of the members and by @samp{@}}
375
@item unions
376
@tab @samp{(} followed by the name of the structure (or @samp{?} if the union is unnamed), the @samp{=} sign, the type of the members followed by @samp{)}
377
@item vectors
378
@tab @samp{![} followed by the vector_size (the number of bytes composing the vector) followed by a comma, followed by the alignment (in bytes) of the vector, followed by the type of the elements followed by @samp{]}
379
@end multitable
380
 
381
Here are some types and their encodings, as they are generated by the
382
compiler on an i386 machine:
383
 
384
@sp 1
385
 
386
@multitable @columnfractions .25 .75
387
@item Objective-C type
388
@tab Compiler encoding
389
@item
390
@smallexample
391
int a[10];
392
@end smallexample
393
@tab @code{[10i]}
394
@item
395
@smallexample
396
struct @{
397
  int i;
398
  float f[3];
399
  int a:3;
400
  int b:2;
401
  char c;
402
@}
403
@end smallexample
404
@tab @code{@{?=i[3f]b128i3b131i2c@}}
405
@item
406
@smallexample
407
int a __attribute__ ((vector_size (16)));
408
@end smallexample
409
@tab @code{![16,16i]} (alignment would depend on the machine)
410
@end multitable
411
 
412
@sp 1
413
 
414
In addition to the types the compiler also encodes the type
415
specifiers.  The table below describes the encoding of the current
416
Objective-C type specifiers:
417
 
418
@sp 1
419
 
420
@multitable @columnfractions .25 .75
421
@item Specifier
422
@tab Encoding
423
@item @code{const}
424
@tab @code{r}
425
@item @code{in}
426
@tab @code{n}
427
@item @code{inout}
428
@tab @code{N}
429
@item @code{out}
430
@tab @code{o}
431
@item @code{bycopy}
432
@tab @code{O}
433
@item @code{byref}
434
@tab @code{R}
435
@item @code{oneway}
436
@tab @code{V}
437
@end multitable
438
 
439
@sp 1
440
 
441
The type specifiers are encoded just before the type.  Unlike types
442
however, the type specifiers are only encoded when they appear in method
443
argument types.
444
 
445
Note how @code{const} interacts with pointers:
446
 
447
@sp 1
448
 
449
@multitable @columnfractions .25 .75
450
@item Objective-C type
451
@tab Compiler encoding
452
@item
453
@smallexample
454
const int
455
@end smallexample
456
@tab @code{ri}
457
@item
458
@smallexample
459
const int*
460
@end smallexample
461
@tab @code{^ri}
462
@item
463
@smallexample
464
int *const
465
@end smallexample
466
@tab @code{r^i}
467
@end multitable
468
 
469
@sp 1
470
 
471
@code{const int*} is a pointer to a @code{const int}, and so is
472
encoded as @code{^ri}.  @code{int* const}, instead, is a @code{const}
473
pointer to an @code{int}, and so is encoded as @code{r^i}.
474
 
475
Finally, there is a complication when encoding @code{const char *}
476
versus @code{char * const}.  Because @code{char *} is encoded as
477
@code{*} and not as @code{^c}, there is no way to express the fact
478
that @code{r} applies to the pointer or to the pointee.
479
 
480
Hence, it is assumed as a convention that @code{r*} means @code{const
481
char *} (since it is what is most often meant), and there is no way to
482
encode @code{char *const}.  @code{char *const} would simply be encoded
483
as @code{*}, and the @code{const} is lost.
484
 
485
@menu
486
* Legacy type encoding::
487
* @@encode::
488
* Method signatures::
489
@end menu
490
 
491
@node Legacy type encoding
492
@subsection Legacy type encoding
493
 
494
Unfortunately, historically GCC used to have a number of bugs in its
495
encoding code.  The NeXT runtime expects GCC to emit type encodings in
496
this historical format (compatible with GCC-3.3), so when using the
497
NeXT runtime, GCC will introduce on purpose a number of incorrect
498
encodings:
499
 
500
@itemize @bullet
501
 
502
@item
503
the read-only qualifier of the pointee gets emitted before the '^'.
504
The read-only qualifier of the pointer itself gets ignored, unless it
505
is a typedef.  Also, the 'r' is only emitted for the outermost type.
506
 
507
@item
508
32-bit longs are encoded as 'l' or 'L', but not always.  For typedefs,
509
the compiler uses 'i' or 'I' instead if encoding a struct field or a
510
pointer.
511
 
512
@item
513
@code{enum}s are always encoded as 'i' (int) even if they are actually
514
unsigned or long.
515
 
516
@end itemize
517
 
518
In addition to that, the NeXT runtime uses a different encoding for
519
bitfields.  It encodes them as @code{b} followed by the size, without
520
a bit offset or the underlying field type.
521
 
522
@node @@encode
523
@subsection @@encode
524
 
525
GNU Objective-C supports the @code{@@encode} syntax that allows you to
526
create a type encoding from a C/Objective-C type.  For example,
527
@code{@@encode(int)} is compiled by the compiler into @code{"i"}.
528
 
529
@code{@@encode} does not support type qualifiers other than
530
@code{const}.  For example, @code{@@encode(const char*)} is valid and
531
is compiled into @code{"r*"}, while @code{@@encode(bycopy char *)} is
532
invalid and will cause a compilation error.
533
 
534
@node Method signatures
535
@subsection Method signatures
536
 
537
This section documents the encoding of method types, which is rarely
538
needed to use Objective-C.  You should skip it at a first reading; the
539
runtime provides functions that will work on methods and can walk
540
through the list of parameters and interpret them for you.  These
541
functions are part of the public ``API'' and are the preferred way to
542
interact with method signatures from user code.
543
 
544
But if you need to debug a problem with method signatures and need to
545
know how they are implemented (i.e., the ``ABI''), read on.
546
 
547
Methods have their ``signature'' encoded and made available to the
548
runtime.  The ``signature'' encodes all the information required to
549
dynamically build invocations of the method at runtime: return type
550
and arguments.
551
 
552
The ``signature'' is a null-terminated string, composed of the following:
553
 
554
@itemize @bullet
555
 
556
@item
557
The return type, including type qualifiers.  For example, a method
558
returning @code{int} would have @code{i} here.
559
 
560
@item
561
The total size (in bytes) required to pass all the parameters.  This
562
includes the two hidden parameters (the object @code{self} and the
563
method selector @code{_cmd}).
564
 
565
@item
566
Each argument, with the type encoding, followed by the offset (in
567
bytes) of the argument in the list of parameters.
568
 
569
@end itemize
570
 
571
For example, a method with no arguments and returning @code{int} would
572
have the signature @code{i8@@0:4} if the size of a pointer is 4.  The
573
signature is interpreted as follows: the @code{i} is the return type
574
(an @code{int}), the @code{8} is the total size of the parameters in
575
bytes (two pointers each of size 4), the @code{@@0} is the first
576
parameter (an object at byte offset @code{0}) and @code{:4} is the
577
second parameter (a @code{SEL} at byte offset @code{4}).
578
 
579
You can easily find more examples by running the ``strings'' program
580
on an Objective-C object file compiled by GCC.  You'll see a lot of
581
strings that look very much like @code{i8@@0:4}.  They are signatures
582
of Objective-C methods.
583
 
584
 
585
@node Garbage Collection
586
@section Garbage Collection
587
 
588
This section is specific for the GNU Objective-C runtime.  If you are
589
using a different runtime, you can skip it.
590
 
591
Support for garbage collection with the GNU runtime has been added by
592
using a powerful conservative garbage collector, known as the
593
Boehm-Demers-Weiser conservative garbage collector.
594
 
595
To enable the support for it you have to configure the compiler using
596
an additional argument, @w{@option{--enable-objc-gc}}.  This will
597
build the boehm-gc library, and build an additional runtime library
598
which has several enhancements to support the garbage collector.  The
599
new library has a new name, @file{libobjc_gc.a} to not conflict with
600
the non-garbage-collected library.
601
 
602
When the garbage collector is used, the objects are allocated using the
603
so-called typed memory allocation mechanism available in the
604
Boehm-Demers-Weiser collector.  This mode requires precise information on
605
where pointers are located inside objects.  This information is computed
606
once per class, immediately after the class has been initialized.
607
 
608
There is a new runtime function @code{class_ivar_set_gcinvisible()}
609
which can be used to declare a so-called @dfn{weak pointer}
610
reference.  Such a pointer is basically hidden for the garbage collector;
611
this can be useful in certain situations, especially when you want to
612
keep track of the allocated objects, yet allow them to be
613
collected.  This kind of pointers can only be members of objects, you
614
cannot declare a global pointer as a weak reference.  Every type which is
615
a pointer type can be declared a weak pointer, including @code{id},
616
@code{Class} and @code{SEL}.
617
 
618
Here is an example of how to use this feature.  Suppose you want to
619
implement a class whose instances hold a weak pointer reference; the
620
following class does this:
621
 
622
@smallexample
623
 
624
@@interface WeakPointer : Object
625
@{
626
    const void* weakPointer;
627
@}
628
 
629
- initWithPointer:(const void*)p;
630
- (const void*)weakPointer;
631
@@end
632
 
633
 
634
@@implementation WeakPointer
635
 
636
+ (void)initialize
637
@{
638
  if (self == objc_lookUpClass ("WeakPointer"))
639
    class_ivar_set_gcinvisible (self, "weakPointer", YES);
640
@}
641
 
642
- initWithPointer:(const void*)p
643
@{
644
  weakPointer = p;
645
  return self;
646
@}
647
 
648
- (const void*)weakPointer
649
@{
650
  return weakPointer;
651
@}
652
 
653
@@end
654
 
655
@end smallexample
656
 
657
Weak pointers are supported through a new type character specifier
658
represented by the @samp{!} character.  The
659
@code{class_ivar_set_gcinvisible()} function adds or removes this
660
specifier to the string type description of the instance variable named
661
as argument.
662
 
663
@c =========================================================================
664
@node Constant string objects
665
@section Constant string objects
666
 
667
GNU Objective-C provides constant string objects that are generated
668
directly by the compiler.  You declare a constant string object by
669
prefixing a C constant string with the character @samp{@@}:
670
 
671
@smallexample
672
  id myString = @@"this is a constant string object";
673
@end smallexample
674
 
675
The constant string objects are by default instances of the
676
@code{NXConstantString} class which is provided by the GNU Objective-C
677
runtime.  To get the definition of this class you must include the
678
@file{objc/NXConstStr.h} header file.
679
 
680
User defined libraries may want to implement their own constant string
681
class.  To be able to support them, the GNU Objective-C compiler provides
682
a new command line options @option{-fconstant-string-class=@var{class-name}}.
683
The provided class should adhere to a strict structure, the same
684
as @code{NXConstantString}'s structure:
685
 
686
@smallexample
687
 
688
@@interface MyConstantStringClass
689
@{
690
  Class isa;
691
  char *c_string;
692
  unsigned int len;
693
@}
694
@@end
695
 
696
@end smallexample
697
 
698
@code{NXConstantString} inherits from @code{Object}; user class
699
libraries may choose to inherit the customized constant string class
700
from a different class than @code{Object}.  There is no requirement in
701
the methods the constant string class has to implement, but the final
702
ivar layout of the class must be the compatible with the given
703
structure.
704
 
705
When the compiler creates the statically allocated constant string
706
object, the @code{c_string} field will be filled by the compiler with
707
the string; the @code{length} field will be filled by the compiler with
708
the string length; the @code{isa} pointer will be filled with
709
@code{NULL} by the compiler, and it will later be fixed up automatically
710
at runtime by the GNU Objective-C runtime library to point to the class
711
which was set by the @option{-fconstant-string-class} option when the
712
object file is loaded (if you wonder how it works behind the scenes, the
713
name of the class to use, and the list of static objects to fixup, are
714
stored by the compiler in the object file in a place where the GNU
715
runtime library will find them at runtime).
716
 
717
As a result, when a file is compiled with the
718
@option{-fconstant-string-class} option, all the constant string objects
719
will be instances of the class specified as argument to this option.  It
720
is possible to have multiple compilation units referring to different
721
constant string classes, neither the compiler nor the linker impose any
722
restrictions in doing this.
723
 
724
@c =========================================================================
725
@node compatibility_alias
726
@section compatibility_alias
727
 
728
The keyword @code{@@compatibility_alias} allows you to define a class name
729
as equivalent to another class name.  For example:
730
 
731
@smallexample
732
@@compatibility_alias WOApplication GSWApplication;
733
@end smallexample
734
 
735
tells the compiler that each time it encounters @code{WOApplication} as
736
a class name, it should replace it with @code{GSWApplication} (that is,
737
@code{WOApplication} is just an alias for @code{GSWApplication}).
738
 
739
There are some constraints on how this can be used---
740
 
741
@itemize @bullet
742
 
743
@item @code{WOApplication} (the alias) must not be an existing class;
744
 
745
@item @code{GSWApplication} (the real class) must be an existing class.
746
 
747
@end itemize
748
 
749
@c =========================================================================
750
@node Exceptions
751
@section Exceptions
752
 
753
GNU Objective-C provides exception support built into the language, as
754
in the following example:
755
 
756
@smallexample
757
  @@try @{
758
    @dots{}
759
       @@throw expr;
760
    @dots{}
761
  @}
762
  @@catch (AnObjCClass *exc) @{
763
    @dots{}
764
      @@throw expr;
765
    @dots{}
766
      @@throw;
767
    @dots{}
768
  @}
769
  @@catch (AnotherClass *exc) @{
770
    @dots{}
771
  @}
772
  @@catch (id allOthers) @{
773
    @dots{}
774
  @}
775
  @@finally @{
776
    @dots{}
777
      @@throw expr;
778
    @dots{}
779
  @}
780
@end smallexample
781
 
782
The @code{@@throw} statement may appear anywhere in an Objective-C or
783
Objective-C++ program; when used inside of a @code{@@catch} block, the
784
@code{@@throw} may appear without an argument (as shown above), in
785
which case the object caught by the @code{@@catch} will be rethrown.
786
 
787
Note that only (pointers to) Objective-C objects may be thrown and
788
caught using this scheme.  When an object is thrown, it will be caught
789
by the nearest @code{@@catch} clause capable of handling objects of
790
that type, analogously to how @code{catch} blocks work in C++ and
791
Java.  A @code{@@catch(id @dots{})} clause (as shown above) may also
792
be provided to catch any and all Objective-C exceptions not caught by
793
previous @code{@@catch} clauses (if any).
794
 
795
The @code{@@finally} clause, if present, will be executed upon exit
796
from the immediately preceding @code{@@try @dots{} @@catch} section.
797
This will happen regardless of whether any exceptions are thrown,
798
caught or rethrown inside the @code{@@try @dots{} @@catch} section,
799
analogously to the behavior of the @code{finally} clause in Java.
800
 
801
There are several caveats to using the new exception mechanism:
802
 
803
@itemize @bullet
804
@item
805
The @option{-fobjc-exceptions} command line option must be used when
806
compiling Objective-C files that use exceptions.
807
 
808
@item
809
With the GNU runtime, exceptions are always implemented as ``native''
810
exceptions and it is recommended that the @option{-fexceptions} and
811
@option{-shared-libgcc} options are used when linking.
812
 
813
@item
814
With the NeXT runtime, although currently designed to be binary
815
compatible with @code{NS_HANDLER}-style idioms provided by the
816
@code{NSException} class, the new exceptions can only be used on Mac
817
OS X 10.3 (Panther) and later systems, due to additional functionality
818
needed in the NeXT Objective-C runtime.
819
 
820
@item
821
As mentioned above, the new exceptions do not support handling
822
types other than Objective-C objects.   Furthermore, when used from
823
Objective-C++, the Objective-C exception model does not interoperate with C++
824
exceptions at this time.  This means you cannot @code{@@throw} an exception
825
from Objective-C and @code{catch} it in C++, or vice versa
826
(i.e., @code{throw @dots{} @@catch}).
827
@end itemize
828
 
829
@c =========================================================================
830
@node Synchronization
831
@section Synchronization
832
 
833
GNU Objective-C provides support for synchronized blocks:
834
 
835
@smallexample
836
  @@synchronized (ObjCClass *guard) @{
837
    @dots{}
838
  @}
839
@end smallexample
840
 
841
Upon entering the @code{@@synchronized} block, a thread of execution
842
shall first check whether a lock has been placed on the corresponding
843
@code{guard} object by another thread.  If it has, the current thread
844
shall wait until the other thread relinquishes its lock.  Once
845
@code{guard} becomes available, the current thread will place its own
846
lock on it, execute the code contained in the @code{@@synchronized}
847
block, and finally relinquish the lock (thereby making @code{guard}
848
available to other threads).
849
 
850
Unlike Java, Objective-C does not allow for entire methods to be
851
marked @code{@@synchronized}.  Note that throwing exceptions out of
852
@code{@@synchronized} blocks is allowed, and will cause the guarding
853
object to be unlocked properly.
854
 
855
Because of the interactions between synchronization and exception
856
handling, you can only use @code{@@synchronized} when compiling with
857
exceptions enabled, that is with the command line option
858
@option{-fobjc-exceptions}.
859
 
860
 
861
@c =========================================================================
862
@node Fast enumeration
863
@section Fast enumeration
864
 
865
@menu
866
* Using fast enumeration::
867
* c99-like fast enumeration syntax::
868
* Fast enumeration details::
869
* Fast enumeration protocol::
870
@end menu
871
 
872
@c ================================
873
@node Using fast enumeration
874
@subsection Using fast enumeration
875
 
876
GNU Objective-C provides support for the fast enumeration syntax:
877
 
878
@smallexample
879
  id array = @dots{};
880
  id object;
881
 
882
  for (object in array)
883
  @{
884
    /* Do something with 'object' */
885
  @}
886
@end smallexample
887
 
888
@code{array} needs to be an Objective-C object (usually a collection
889
object, for example an array, a dictionary or a set) which implements
890
the ``Fast Enumeration Protocol'' (see below).  If you are using a
891
Foundation library such as GNUstep Base or Apple Cocoa Foundation, all
892
collection objects in the library implement this protocol and can be
893
used in this way.
894
 
895
The code above would iterate over all objects in @code{array}.  For
896
each of them, it assigns it to @code{object}, then executes the
897
@code{Do something with 'object'} statements.
898
 
899
Here is a fully worked-out example using a Foundation library (which
900
provides the implementation of @code{NSArray}, @code{NSString} and
901
@code{NSLog}):
902
 
903
@smallexample
904
  NSArray *array = [NSArray arrayWithObjects: @@"1", @@"2", @@"3", nil];
905
  NSString *object;
906
 
907
  for (object in array)
908
    NSLog (@@"Iterating over %@@", object);
909
@end smallexample
910
 
911
 
912
@c ================================
913
@node c99-like fast enumeration syntax
914
@subsection c99-like fast enumeration syntax
915
 
916
A c99-like declaration syntax is also allowed:
917
 
918
@smallexample
919
  id array = @dots{};
920
 
921
  for (id object in array)
922
  @{
923
    /* Do something with 'object'  */
924
  @}
925
@end smallexample
926
 
927
this is completely equivalent to:
928
 
929
@smallexample
930
  id array = @dots{};
931
 
932
  @{
933
    id object;
934
    for (object in array)
935
    @{
936
      /* Do something with 'object'  */
937
    @}
938
  @}
939
@end smallexample
940
 
941
but can save some typing.
942
 
943
Note that the option @option{-std=c99} is not required to allow this
944
syntax in Objective-C.
945
 
946
@c ================================
947
@node Fast enumeration details
948
@subsection Fast enumeration details
949
 
950
Here is a more technical description with the gory details.  Consider the code
951
 
952
@smallexample
953
  for (@var{object expression} in @var{collection expression})
954
  @{
955
    @var{statements}
956
  @}
957
@end smallexample
958
 
959
here is what happens when you run it:
960
 
961
@itemize @bullet
962
@item
963
@code{@var{collection expression}} is evaluated exactly once and the
964
result is used as the collection object to iterate over.  This means
965
it is safe to write code such as @code{for (object in [NSDictionary
966
keyEnumerator]) @dots{}}.
967
 
968
@item
969
the iteration is implemented by the compiler by repeatedly getting
970
batches of objects from the collection object using the fast
971
enumeration protocol (see below), then iterating over all objects in
972
the batch.  This is faster than a normal enumeration where objects are
973
retrieved one by one (hence the name ``fast enumeration'').
974
 
975
@item
976
if there are no objects in the collection, then
977
@code{@var{object expression}} is set to @code{nil} and the loop
978
immediately terminates.
979
 
980
@item
981
if there are objects in the collection, then for each object in the
982
collection (in the order they are returned) @code{@var{object expression}}
983
is set to the object, then @code{@var{statements}} are executed.
984
 
985
@item
986
@code{@var{statements}} can contain @code{break} and @code{continue}
987
commands, which will abort the iteration or skip to the next loop
988
iteration as expected.
989
 
990
@item
991
when the iteration ends because there are no more objects to iterate
992
over, @code{@var{object expression}} is set to @code{nil}.  This allows
993
you to determine whether the iteration finished because a @code{break}
994
command was used (in which case @code{@var{object expression}} will remain
995
set to the last object that was iterated over) or because it iterated
996
over all the objects (in which case @code{@var{object expression}} will be
997
set to @code{nil}).
998
 
999
@item
1000
@code{@var{statements}} must not make any changes to the collection
1001
object; if they do, it is a hard error and the fast enumeration
1002
terminates by invoking @code{objc_enumerationMutation}, a runtime
1003
function that normally aborts the program but which can be customized
1004
by Foundation libraries via @code{objc_set_mutation_handler} to do
1005
something different, such as raising an exception.
1006
 
1007
@end itemize
1008
 
1009
@c ================================
1010
@node Fast enumeration protocol
1011
@subsection Fast enumeration protocol
1012
 
1013
If you want your own collection object to be usable with fast
1014
enumeration, you need to have it implement the method
1015
 
1016
@smallexample
1017
- (unsigned long) countByEnumeratingWithState: (NSFastEnumerationState *)state
1018
                                      objects: (id *)objects
1019
                                        count: (unsigned long)len;
1020
@end smallexample
1021
 
1022
where @code{NSFastEnumerationState} must be defined in your code as follows:
1023
 
1024
@smallexample
1025
typedef struct
1026
@{
1027
  unsigned long state;
1028
  id            *itemsPtr;
1029
  unsigned long *mutationsPtr;
1030
  unsigned long extra[5];
1031
@} NSFastEnumerationState;
1032
@end smallexample
1033
 
1034
If no @code{NSFastEnumerationState} is defined in your code, the
1035
compiler will automatically replace @code{NSFastEnumerationState *}
1036
with @code{struct __objcFastEnumerationState *}, where that type is
1037
silently defined by the compiler in an identical way.  This can be
1038
confusing and we recommend that you define
1039
@code{NSFastEnumerationState} (as shown above) instead.
1040
 
1041
The method is called repeatedly during a fast enumeration to retrieve
1042
batches of objects.  Each invocation of the method should retrieve the
1043
next batch of objects.
1044
 
1045
The return value of the method is the number of objects in the current
1046
batch; this should not exceed @code{len}, which is the maximum size of
1047
a batch as requested by the caller.  The batch itself is returned in
1048
the @code{itemsPtr} field of the @code{NSFastEnumerationState} struct.
1049
 
1050
To help with returning the objects, the @code{objects} array is a C
1051
array preallocated by the caller (on the stack) of size @code{len}.
1052
In many cases you can put the objects you want to return in that
1053
@code{objects} array, then do @code{itemsPtr = objects}.  But you
1054
don't have to; if your collection already has the objects to return in
1055
some form of C array, it could return them from there instead.
1056
 
1057
The @code{state} and @code{extra} fields of the
1058
@code{NSFastEnumerationState} structure allows your collection object
1059
to keep track of the state of the enumeration.  In a simple array
1060
implementation, @code{state} may keep track of the index of the last
1061
object that was returned, and @code{extra} may be unused.
1062
 
1063
The @code{mutationsPtr} field of the @code{NSFastEnumerationState} is
1064
used to keep track of mutations.  It should point to a number; before
1065
working on each object, the fast enumeration loop will check that this
1066
number has not changed.  If it has, a mutation has happened and the
1067
fast enumeration will abort.  So, @code{mutationsPtr} could be set to
1068
point to some sort of version number of your collection, which is
1069
increased by one every time there is a change (for example when an
1070
object is added or removed).  Or, if you are content with less strict
1071
mutation checks, it could point to the number of objects in your
1072
collection or some other value that can be checked to perform an
1073
approximate check that the collection has not been mutated.
1074
 
1075
Finally, note how we declared the @code{len} argument and the return
1076
value to be of type @code{unsigned long}.  They could also be declared
1077
to be of type @code{unsigned int} and everything would still work.
1078
 
1079
@c =========================================================================
1080
@node Messaging with the GNU Objective-C runtime
1081
@section Messaging with the GNU Objective-C runtime
1082
 
1083
This section is specific for the GNU Objective-C runtime.  If you are
1084
using a different runtime, you can skip it.
1085
 
1086
The implementation of messaging in the GNU Objective-C runtime is
1087
designed to be portable, and so is based on standard C.
1088
 
1089
Sending a message in the GNU Objective-C runtime is composed of two
1090
separate steps.  First, there is a call to the lookup function,
1091
@code{objc_msg_lookup ()} (or, in the case of messages to super,
1092
@code{objc_msg_lookup_super ()}).  This runtime function takes as
1093
argument the receiver and the selector of the method to be called; it
1094
returns the @code{IMP}, that is a pointer to the function implementing
1095
the method.  The second step of method invocation consists of casting
1096
this pointer function to the appropriate function pointer type, and
1097
calling the function pointed to it with the right arguments.
1098
 
1099
For example, when the compiler encounters a method invocation such as
1100
@code{[object init]}, it compiles it into a call to
1101
@code{objc_msg_lookup (object, @@selector(init))} followed by a cast
1102
of the returned value to the appropriate function pointer type, and
1103
then it calls it.
1104
 
1105
@menu
1106
* Dynamically registering methods::
1107
* Forwarding hook::
1108
@end menu
1109
 
1110
@c =========================================================================
1111
@node Dynamically registering methods
1112
@subsection Dynamically registering methods
1113
 
1114
If @code{objc_msg_lookup()} does not find a suitable method
1115
implementation, because the receiver does not implement the required
1116
method, it tries to see if the class can dynamically register the
1117
method.
1118
 
1119
To do so, the runtime checks if the class of the receiver implements
1120
the method
1121
 
1122
@smallexample
1123
+ (BOOL) resolveInstanceMethod: (SEL)selector;
1124
@end smallexample
1125
 
1126
in the case of an instance method, or
1127
 
1128
@smallexample
1129
+ (BOOL) resolveClassMethod: (SEL)selector;
1130
@end smallexample
1131
 
1132
in the case of a class method.  If the class implements it, the
1133
runtime invokes it, passing as argument the selector of the original
1134
method, and if it returns @code{YES}, the runtime tries the lookup
1135
again, which could now succeed if a matching method was added
1136
dynamically by @code{+resolveInstanceMethod:} or
1137
@code{+resolveClassMethod:}.
1138
 
1139
This allows classes to dynamically register methods (by adding them to
1140
the class using @code{class_addMethod}) when they are first called.
1141
To do so, a class should implement @code{+resolveInstanceMethod:} (or,
1142
depending on the case, @code{+resolveClassMethod:}) and have it
1143
recognize the selectors of methods that can be registered dynamically
1144
at runtime, register them, and return @code{YES}.  It should return
1145
@code{NO} for methods that it does not dynamically registered at
1146
runtime.
1147
 
1148
If @code{+resolveInstanceMethod:} (or @code{+resolveClassMethod:}) is
1149
not implemented or returns @code{NO}, the runtime then tries the
1150
forwarding hook.
1151
 
1152
Support for @code{+resolveInstanceMethod:} and
1153
@code{resolveClassMethod:} was added to the GNU Objective-C runtime in
1154
GCC version 4.6.
1155
 
1156
@c =========================================================================
1157
@node Forwarding hook
1158
@subsection Forwarding hook
1159
 
1160
The GNU Objective-C runtime provides a hook, called
1161
@code{__objc_msg_forward2}, which is called by
1162
@code{objc_msg_lookup()} when it can't find a method implementation in
1163
the runtime tables and after calling @code{+resolveInstanceMethod:}
1164
and @code{+resolveClassMethod:} has been attempted and did not succeed
1165
in dynamically registering the method.
1166
 
1167
To configure the hook, you set the global variable
1168
@code{__objc_msg_foward2} to a function with the same argument and
1169
return types of @code{objc_msg_lookup()}.  When
1170
@code{objc_msg_lookup()} can not find a method implementation, it
1171
invokes the hook function you provided to get a method implementation
1172
to return.  So, in practice @code{__objc_msg_forward2} allows you to
1173
extend @code{objc_msg_lookup()} by adding some custom code that is
1174
called to do a further lookup when no standard method implementation
1175
can be found using the normal lookup.
1176
 
1177
This hook is generally reserved for ``Foundation'' libraries such as
1178
GNUstep Base, which use it to implement their high-level method
1179
forwarding API, typically based around the @code{forwardInvocation:}
1180
method.  So, unless you are implementing your own ``Foundation''
1181
library, you should not set this hook.
1182
 
1183
In a typical forwarding implementation, the @code{__objc_msg_forward2}
1184
hook function determines the argument and return type of the method
1185
that is being looked up, and then creates a function that takes these
1186
arguments and has that return type, and returns it to the caller.
1187
Creating this function is non-trivial and is typically performed using
1188
a dedicated library such as @code{libffi}.
1189
 
1190
The forwarding method implementation thus created is returned by
1191
@code{objc_msg_lookup()} and is executed as if it was a normal method
1192
implementation.  When the forwarding method implementation is called,
1193
it is usually expected to pack all arguments into some sort of object
1194
(typically, an @code{NSInvocation} in a ``Foundation'' library), and
1195
hand it over to the programmer (@code{forwardInvocation:}) who is then
1196
allowed to manipulate the method invocation using a high-level API
1197
provided by the ``Foundation'' library.  For example, the programmer
1198
may want to examine the method invocation arguments and name and
1199
potentially change them before forwarding the method invocation to one
1200
or more local objects (@code{performInvocation:}) or even to remote
1201
objects (by using Distributed Objects or some other mechanism).  When
1202
all this completes, the return value is passed back and must be
1203
returned correctly to the original caller.
1204
 
1205
Note that the GNU Objective-C runtime currently provides no support
1206
for method forwarding or method invocations other than the
1207
@code{__objc_msg_forward2} hook.
1208
 
1209
If the forwarding hook does not exist or returns @code{NULL}, the
1210
runtime currently attempts forwarding using an older, deprecated API,
1211
and if that fails, it aborts the program.  In future versions of the
1212
GNU Objective-C runtime, the runtime will immediately abort.

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.