|
|
|
| |||||||||
|
|
«
Previous Thread
|
Next Thread
»
|
Thread Tools | Search this Thread | Display Modes |
|
#1
|
|||
|
|||
|
Frequently Asked Questions - comp.lang.objective-c
Frequently Asked Questions - comp.lang.objective-c
compiled by David Stes (stes (AT) pandora.be) April 16 2004 Contents * Contents * 1. About this FAQ + 1.1 Where can I find the latest version of the FAQ ? * 2. Objective-C Compiler Commands + 2.1 What's the file suffix for Objective-C source ? + 2.2 How do I compile .m files with the Stepstone compiler ? + 2.3 How do I compile .m files with the Apple compiler ? + 2.4 How do I compile .m files with the GNU C compiler ? + 2.5 How do I compile .m files with the POC ? * 3. Objective-C preprocessor issues + 3.1 What's the syntax for comments ? + 3.2 How do I include the root class ? + 3.3 What is #import ? + 3.4 Why am I lectured about using #import ? * 4. Object datatype (id) + 4.1 What is id ? + 4.2 What is the difference between self and super ? + 4.3 What is (AT) defs() ? * 5. Message selectors (SEL) + 5.1 What is a SEL ? + 5.2 What is perform: doing ? + 5.3 How do I know the SEL of a given method ? * 6. Implementation pointers (IMP) + 6.1 What is an IMP ? + 6.2 How do I get an IMP given a SEL ? + 6.3 How do I send a message given an IMP ? + 6.4 How can I use IMP for methods returning double ? + 6.5 Can I use perform: for a message returning double ? * 7. Copying objects + 7.1 What's the difference between copy and deepCopy ? * 8. Objective-C and C++ + 8.1 How can I link a C++ library into an Objective-C program ? * 9. Messages + 9.1 How do I make a static method ? + 9.2 How do I prevent an object from sending a given message ? + 9.3 Do I have to recompile everything if I change the implementation of a method ? * 10. Instance and Class Variables + 10.1 Do I have to recompile everything if I change instance variables of a class ? * 11. Objective-C and X-Windows + 11.1 How do I include X Intrinsics headers into an Objective-C file ? * 12. Stepstone Specific Questions + 12.1 How do I allocate an object on the stack ? * 13. GNU Objective-C Specific Questions + 13.1 Why do I get a 'floating point exception' ? * 14. Apple Objective-C Specific Questions + 14.1 What's the class of a constant string ? + 14.2 How can I link a C++ library into an Objective-C program ? * 15. Portable Object Compiler Objective-C Specific Questions + 15.1 What's the syntax for class variables ? + 15.2 How do I forward messages ? + 15.3 How can I link a C++ library into an Objective-C program ? * 16. Books and further reading + 16.1 Object-Oriented Programming : An Evolutionary Approach, 2nd Ed. + 16.2 An Introduction To Object-Oriented Programming, 2nd Ed. + 16.3 Objective-C : Object-Oriented Programming Techniques + 16.4 Applications of Object-Oriented Programming; C++ SmallTalk Actor Objective-C Object PASCAL 1. About this FAQ 1.1 Where can I find the latest version of the FAQ ? It's posted once a month to comp.lang.objective-c, comp.answers and news.answers. It is archived at ftp://rtfm.mit.edu/pub/faqs/computer-lang/Objective-C/faq. 2. Objective-C Compiler Commands 2.1 What's the file suffix for Objective-C source ? It's .m for implementation files, and .h for header files. Objective-C compilers usually also accept .c as a suffix, but compile those files in plain C mode. 2.2 How do I compile .m files with the Stepstone compiler ? objcc -c class.m objcc -o class class.o See http://www.stepstn.com for more information. 2.3 How do I compile .m files with the Apple compiler ? cc -c class.m cc -o class class.o See http://www.apple.com for more information. 2.4 How do I compile .m files with the GNU C compiler ? gcc -c class.m gcc -o class class.o -lobjc -lpthread See http://www.gnu.org for more information. 2.5 How do I compile .m files with the POC ? objc -c class.m objc -o class class.o See http://metalab.unc.edu/pub/Linux/devel/lang/objc/ for more information. 3. Objective-C preprocessor issues 3.1 What's the syntax for comments ? The Objective-C preprocessor usually supports two styles of comments : // this is a BCPL-style comment (extends to end of line) and /* this is a C-style comment */ 3.2 How do I include the root class ? On Stepstone and the POC, the header file to include is : <Object.h> On GNU cc and Apple cc, it's : <objc/Object.h> The root class is located in a directory called runtime for the Stepstone compiler, and in a directory called objcrt for the POC, but because of implicit -I options passed on to the preprocessor, these locations are automatically searched. 3.3 What is #import ? It's a C preprocessor construct to avoid multiple inclusions of the same file. #import <Object.h> is an alternative to #include <Object.h> where the .h file is protected itself against multiple inclusions : #ifndef _OBJECT_H_ ... #define _OBJECT_H_ #endif 3.4 Why am I lectured about using #import ? The GNU Objective-C compiler emits a warning when you use #import because some people find using #import poor style. You can turn off the warning by using the -Wno-import option, you could modify the compiler source code and set the variable warn_import (in the file cccp.c) or you could convert your code to use pairs of #ifndef and #endif, as shown above, which makes your code work with all compilers. 4. Object datatype (id) 4.1 What is id ? It's a generic C type that Objective-C uses for an arbitrary object. For example, a static function that takes one object as argument and returns an object, could be declared as : static id myfunction(id argument) { ... } 4.2 What is the difference between self and super ? self is a variable that refers to the object that received a message in a method implementation. super refers to the same variable, but directs the compiler to use a method implementation from the superclass. Using pseudo-code, where copy (from super) is the syntax for the copy implementation of the superclass, the following are equivalent : myObject = [super copy]; and, myObject = [self copy (from super)]; // pseudo-code 4.3 What is (AT) defs() ? It's a compiler directive to get access to the internal memory layout of instances of a particular class. typedef struct { (AT) defs(MyClass) } *TMyClass; defines a C-type TMyClass with a memory layout that is the same as that of MyClass instances. 5. Message selectors (SEL) 5.1 What is a SEL ? It's the C type of a message selector; it's often defined as a (uniqued) string of characters (the name of the method, including colons), but not all compilers define the type as such. 5.2 What is perform: doing ? perform: is a message to send a message, identified by its message selector (SEL), to an object. 5.3 How do I know the SEL of a given method ? If the name of the method is known at compile time, use (AT) selector : [myObject perform: (AT) selector(close)]; At runtime, you can lookup the selector by a runtime function that takes the name of the message as argument, as in : SEL mySel = selUid(name); // for Stepstone SEL mySel = sel_getUid(name); // for Apple SEL mySel = sel_get_any_uid(name); // for GNU Objective C SEL mySel = selUid(name); // for POC 6. Implementation pointers (IMP) 6.1 What is an IMP ? It's the C type of a method implementation pointer, a function pointer to the function that implements an Objective-C method. It is defined to return id and takes two hidden arguments, self and _cmd : typedef id (*IMP)(id self,SEL _cmd,...); 6.2 How do I get an IMP given a SEL ? This can be done by sending a methodFor: message : IMP myImp = [myObject methodFor:mySel]; 6.3 How do I send a message given an IMP ? By dereferencing the function pointer. The following are all equivalent : [myObject myMessage]; or IMP myImp = [myObject methodFor: (AT) selector(myMessage)]; myImp(myObject, (AT) selector(myMessage)); or [myObject perform: (AT) selector(myMessage)]; 6.4 How can I use IMP for methods returning double ? For methods that return a C type such as double instead of id, the IMP function pointer is casted from pointer to a function returning id to pointer to a function returning double : double aDouble = ((double (*) (id,SEL))myImp)(self,_cmd); 6.5 Can I use perform: for a message returning double ? No. The method perform: is for sending messages returning id without any other argument. Use perform:with: if the message returns id and takes one argument. Use methodFor: for the general case of any number of arguments and any return type. 7. Copying objects 7.1 What's the difference between copy and deepCopy ? copy is intented to make a bytecopy of the object, sharing pointers with the original, and can be overridden to copy additional memory. deepCopy is intented to make a copy that doesn't share pointers with the original. A deep copy of an object contains copies of its instance variables, while a plain copy is normally just a copy at the first level. 8. Objective-C and C++ 8.1 How can I link a C++ library into an Objective-C program ? You have two options : either use the Apple compiler or use the POC. The former accepts a mix of C++ and Objective-C syntax (called Objective-C++), the latter compiles Objective-C into C and then compiles the intermediate code with a C++ compiler. See the compiler specific questions for more information. 9. Messages 9.1 How do I make a static method ? Methods are always implemented in Objective-C as static functions. The only way to obtain the IMP (implementation pointer) of a method is through the runtime (via methodFor: and friends), because the function itself is static to the file that implements the method. 9.2 How do I prevent an object from sending a given message ? You can't. If your object responds to a message, any other class can send this message. You could add an extra argument sender and check, as in : - mymethod:sender { if ([sender isKindOf:..]) ... } But this still requires cooperation of the sender, to use a correct argument : [anObject mymethod:self]; 9.3 Do I have to recompile everything if I change the implementation of a method ? No, you only have to recompile the implementation of the method itself. Files that only send that particular messages do not have to be recompiled because Objective-C has dynamic binding. 10. Instance and Class Variables 10.1 Do I have to recompile everything if I change instance variables of a class ? You have to recompile that class, all of its subclasses, and those files that use (AT) defs() or use direct access to the instance variables of that class. In short, using (AT) defs() to access instance variables, or accessing instance variables through subclassing, breaks the encapsulation that the Objective-C runtime normally provides for all other files (the files that you do not have to recompile). 11. Objective-C and X-Windows 11.1 How do I include X Intrinsics headers into an Objective-C file ? To avoid a conflict between Objective-C's Object and the X11/Object, do the following : #include <Object.h> #define Object XtObject #include <X11/Intrinsic.h> #include <X11/IntrinsicP.h> #undef Object 12. Stepstone Specific Questions 12.1 How do I allocate an object on the stack ? To allocate an instance of 'MyClass' on the stack : MyClass aClass = [MyClass new]; 13. GNU Objective-C Specific Questions 13.1 Why do I get a 'floating point exception' ? This used to happen on some platforms and is described at ftp://ftp.ics.ele.tue.nl/pub/users/tiggr/objc/README.387. A solution was to add -lieee to the command line, so that an invalid floating point operation in the runtime did not send a signal. DJGPP users can consult http://www.delorie.com/djgpp/v2faq/. AIX users may want to consult http://world.std.com/~gsk/oc-rs6000-problems.html. In some cases, you can fix the problem by upgrading to a more recent version of the GNU Objective-C runtime and/or compiler. 14. Apple Objective-C Specific Questions 14.1 What's the class of a constant string ? It's an NXConstantString. NXConstantString *myString = (AT) "my string"; 14.2 How can I link a C++ library into an Objective-C program ? c++ -c file.m c++ file.o -lcpluslib -o myprogram 15. Portable Object Compiler Objective-C Specific Questions 15.1 What's the syntax for class variables ? List the class variables after the instance variables, and group them together in the same way as instance variables, as follows : (AT) implementation MyClass : Object { id ivar1; int ivar2; } : { id cvar1; } (AT) end 15.2 How do I forward messages ? You have to implement doesNotUnderstand: to send a sentTo: message. - doesNotUnderstand:aMsg { return [aMsg sentTo:aProxy]; } 15.3 How can I link a C++ library into an Objective-C program ? objc -c -cplus file.m objc -cplus file.o -lcpluslib -o myprogram 16. Books and further reading 16.1 Object-Oriented Programming : An Evolutionary Approach, 2nd Ed. Brad Cox & Andy Novobilski, ISBN 0201548348. 16.2 An Introduction To Object-Oriented Programming, 2nd Ed. Timothy Budd, ISBN 0201824191 16.3 Objective-C : Object-Oriented Programming Techniques Pinson, Lewis J. / Wiener, Richard S., ISBN 0201508281 16.4 Applications of Object-Oriented Programming; C++ SmallTalk Actor Objective-C Object PASCAL Pinson, Lewis J. / Wiener, Richard S., ISBN 0201503697 |
| Viewing: Web Development Archives > FAQs > C/C++ > Frequently Asked Questions - comp.lang.objective-c |
| Thread Tools | Search this Thread |
| Display Modes | Rate This Thread |
|
|
|
|