Objc runtime additions.
Objective-C Ruby
Pull request Compare This branch is 14 commits ahead, 1 commit behind ebf:master.
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
SLObjectiveCRuntimeAdditions
Tests
.gitignore
.gitmodules
LICENSE
README.md
SLObjectiveCRuntimeAdditions.podspec

README.md

SLObjectiveCRuntimeAdditions

SLObjectiveCRuntimeAdditions introduces the following new runtime additions:

  • void class_swizzleSelector(Class class, SEL originalSelector, SEL newSelector);
  • void class_swizzlesMethodsWithPrefix(Class class, NSString *prefix);
  • void class_enumerateMethodList(Class class, SLMethodEnumertor enumerator);
  • Class class_subclassPassingTest(Class class, SLClassTest test);
  • IMP class_replaceMethodWithBlock(Class class, SEL originalSelector, id block);
  • void class_implementPropertyInUserDefaults(Class class, NSString *propertyName, BOOL automaticSynchronizeUserDefaults);
  • void class_implementProperty(Class class, NSString *propertyName, objc_AssociationPolicy associationPolicy);

Getting runtime information about blocks

SLBlockDescription lets you inspect blocks including arguments and compile time features at runtime.

One could use SLBlockDescription for the following test block:

// a test block.
BOOL(^testBlock)(BOOL animated, id object) = ^BOOL(BOOL animated, id object) {
    return YES;
};

// allocating a block description
SLBlockDescription *blockDescription = [[SLBlockDescription alloc] initWithBlock:testBlock];

// getting a method signature for this block
NSMethodSignature *methodSignature = blockDescription.blockSignature;
/**
<NSMethodSignature: 0x253f080>
    number of arguments = 3
    frame size = 12
    is special struct return? NO
    return value: -------- -------- -------- --------
        type encoding (c) 'c'
        flags {isSigned}
        modifiers {}
        frame {offset = 0, offset adjust = 0, size = 4, size adjust = -3}
        memory {offset = 0, size = 1}
    argument 0: -------- -------- -------- --------
        type encoding (@) '@?'
        flags {isObject, isBlock}
        modifiers {}
        frame {offset = 0, offset adjust = 0, size = 4, size adjust = 0}
        memory {offset = 0, size = 4}
    argument 1: -------- -------- -------- --------
        type encoding (c) 'c'
        flags {isSigned}
        modifiers {}
        frame {offset = 4, offset adjust = 0, size = 4, size adjust = -3}
        memory {offset = 0, size = 1}
    argument 2: -------- -------- -------- --------
        type encoding (@) '@'
        flags {isObject}
        modifiers {}
        frame {offset = 8, offset adjust = 0, size = 4, size adjust = 0}
        memory {offset = 0, size = 4}
*/

License

MIT

Thanks goes to the Block Implementation Specification and the A2DynamicDelegate project for some good libffi samples and convertion from encodings to libffi types.