Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Write Objective-C class from scratch

Tags:

objective-c

I'd like to write an Objective-C class without Cocoa or GNU's Object.h (for educational purposes). I dug around the net and it seems to me that quite a lot of stuff that one would expect to "come with the language", such as classes and message sending are actually defined in files written by third parties, such as objc-runtime.h.

Is there any documentation about what is really pure Objective-C and what is part of the runtime / frameworks? And what functionality do I have to implement to get a working environment without using any third-party code such as Object.h or objc-runtime.h (note again that this is for educational purposes, not for production code)?

Thanks for any insight!

like image 230
ryyst Avatar asked May 27 '11 15:05

ryyst


2 Answers

Really, the only thing you must take care of yourself if you don't inherit from NSObject is object creation and destruction; methods otherwise behave the same way regardless of their parent class. Features like KVC and memory management are features of OpenStep/Cocoa, but not required as part of the language.

Here's a class from scratch:

@interface MyClass { // note the lack of a superclass here
    @private Class isa;
}
+ (MyClass *)create;
- (void)destroy;

- (int)randomNumber;
@end


@implementation MyClass
+ (MyClass *)create {
    return class_createInstance(self, 0);
}

- (void)destroy {
    object_dispose(self);
}

- (int)randomNumber {
    return rand();
}
@end

And here's how it could be used:

int main(int argc, char **argv) {
    MyClass *foo = [MyClass create];
    if (foo) {
        printf("random! %i\n", [foo randomNumber]);
        [foo destroy];
    }
}

Edit: If you don't even want to use class_createInstance() and object_dispose(), you'll have to implement equivalents manually, as well as an equivalent of class_getInstanceSize() so you know how much memory an object occupies. But even if you manage that, don't think you've escaped the Objective-C runtime! Message dispatch is still entirely built on the C functions in the runtime, and Objective-C syntax is transformed into calls to those functions during compilation.

like image 139
Jonathan Grynspan Avatar answered Nov 16 '22 01:11

Jonathan Grynspan


Matt Gallagher wrote a really cool post on writing a bare-bones Cocoa program. Since Objective-C is a superset of C, you can just do:

echo "int main(){return 0;}" | gcc -x objective-c -; ./a.out ; echo $?

Anyways, you probably would get a lot out of reading his post.

like image 25
ipd Avatar answered Nov 16 '22 01:11

ipd