I know that there are functions in the objective-c runtime that allow you to create objects directly, such as class_createInstance. What I would like to know is if anything actually uses these functions other than the root classes’ (NSObject) alloc method. I think things like KVC bindings might, but those aren’t present on the iPhone OS (to my knowledge, correct me if I’m wrong), so is there anything that would do this?
In case you’re wondering/it matters, I’m looking to allocate the size of an instance in a way that circumvents the objc runtime by declaring no ivars on a class, but overriding the +alloc method and calling class_createInstance(self, numberofbytesofmyivars).
Thanks
EDIT
I think I need to be more specific. I am adding classes to the runtime at runtime, and possibly unload and reload an altered version of the same class. I’ve worked around most of the issues so far, due to things like class_addMethod, but there’s no equivalent for ivars after the class has been registered. The two solutions I can think of are having no actual ivars as far as the runtime is concerned, but overriding alloc to make sure I have enough room for them through extraBytes, or alternatively declaring an ivar which is a pointer to all of my actual ivars, which I can then obviously do whatever I want with. I would prefer to use the former strategy but there are a number of things that can go wrong, like if something allocates an instance of my object without going through my overloaded alloc method. Does anyone know of one of these things?
I’m not sure if you’re trying to change the behavior of existing classes, which is not safe, or trying to do something for custom classes you own that are direct subclasses of NSObject, which probably is.
Almost all NSStrings you see in practice are instances of a private subclass, and that subclass allocates space for the string inline with the object. Like, instead of containing a pointer to a char*, the character data comes right after the ivars in the object. The extraBytes parameter in
NSAllocateObject(Class aClass, NSUInteger extraBytes, NSZone *zone)is there for purposes such as this.So on the one hand, yes, you can pull tricks like that. On the other, you need to know you’re doing it with your stuff. If you try to do something like that with the private subclass of NSString (which is private, so you’re only going to interact with through runtime introspection), you’re probably going to conflict.
There are a few public cocoa classes that also do stuff like this, so you’re best off if your classes inherit directly from NSObject. NSLock is one. The layout in memory for a custom subclass of NSLock looks like
{ isa, <ivars of NSLock> <ivars of subclass of NSLock> <more NSLock stuff, space reserved using the extraBytes parameter> }.Also, just for the heck of it, note that +alloc calls +allocWithZone:, and +allocWithZone: is the more common override point.