Here's how to create a property on the fly (great for categories)
@dynamic progressView;
- (void)setProgressView:(ACProgressView )progressView { objc_setAssociatedObject(self, ACProgressViewKey, progressView, OBJC_ASSOCIATION_RETAIN_NONATOMIC); }
- (ACProgressView )progressView { return objc_getAssociatedObject(self, ACProgressViewKey); }
NSObject obj = [NSObject init];
giveObjectAProperty(obj, @"progressView");
obj.progressView = [NSNumber 42];
Writing giveObjectAProperty may not be "nearly impossible" but it sure isn't easy.And of course the parent is talking about methods, not properties, but...same argument.
Here's how you'd make that class on the fly:
Class mySubclass = objc_allocateClassPair([NSObject class], "MySubclass", 0);
Here's how you'd add a description method to a newly created class: static NSString *Description(id self, SEL _cmd){
return [NSString stringWithFormat: @"<%@ %p: foo=%@>",[self class], self, [self foo]];
}
// add Description to mySubclass
// grab NSObject's description signature so we can borrow it
Method description = class_getInstanceMethod([NSObject class],
@selector(description));
const char *types = method_getTypeEncoding(description);
// now add
class_addMethod(mySubclass, @selector(description), (IMP)Description, types);
And your iVars: class_addIvar(mySubclass, "foo", sizeof(id), rint(log2(sizeof(id))), @encode(id)); klass = Object.const_set "MySubclass", Class.new(Object)
klass.send(:attr_accessor, :foo)
klass.send(:define_method, "description") {
"<#{self.class}: foo=#{self.foo}>"
}[1]: https://github.com/mikeash/MAObjCRuntime [2]: https://github.com/mikeash/MACollectionUtilities
Edit: I obv. didn't write your parent comment. What I meant was that I'm sure others in my position, having read your parent, would appreciate more elaboration from you as well. :)
* Obj-C, from the very start, was implemented as a strict superset of C. This means that every valid bit of C code must also be valid Obj-C. This places some rather sever limitations on the Obj-C syntax. Ruby does not have this limitation, and neither does RubyMotion. So one reason you might use RubyMotion is to get a cleaner syntax that does the same thing as Obj-C.
* The Obj-C runtime is very dynamic. You can create classes on the fly, add methods to them at runtime, move methods around between objects, and create methods dynamically. The Obj-C language makes it nearly impossible to take advantage of any of these features of the Obj-C runtime. So another reason you might use RubyMotion is to get the most out of the Obj-C runtime.