Created
October 7, 2016 09:33
-
-
Save DavidDeBels/b5d68175a02a7e4ba09b9e393ba24908 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// NSObject+objcruntime.h | |
// | |
// Created by David De Bels on 07/10/16. | |
// | |
// (c) 2016 November Five BVBA | |
// | |
#import <objc/runtime.h> | |
#import <Foundation/Foundation.h> | |
#pragma mark - NSObject objcruntime Category Interface - | |
@interface NSObject (objcruntime) | |
#pragma mark Access iVars | |
+(NSArray*)objcruntime_getIvarNames; | |
-(Ivar)objcruntime_getIvarWithName:(NSString*)name; | |
-(id)objcruntime_getObjectForIvarWithName:(NSString*)ivarName; | |
-(id)objcruntime_getObjectForIvar:(Ivar)ivar; | |
-(void)objcruntime_setObject:(id)object forIvarNameWithName:(NSString*)ivarName; | |
-(void)objcruntime_setObject:(id)object forIvar:(Ivar)ivar; | |
#pragma mark Access Properties | |
+(NSArray*)objcruntime_getPropertyNames; | |
#pragma mark Access Methods | |
+(NSArray*)objcruntime_getMethodNames; | |
#pragma mark Associated Objects | |
-(id)objcruntime_getAssociatedObjectForKey:(NSString*)aKey; | |
-(void)objcruntime_setAssociatedObject:(id)object forKey:(NSString*)aKey policy:(objc_AssociationPolicy)policy; | |
-(void)objcruntime_removeAssociatedObjectForKey:(NSString*)aKey; | |
-(void)objcruntime_removeAllAssociatedObjects; | |
@end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// NSObject+objcruntime.m | |
// | |
// Created by David De Bels on 07/10/16. | |
// | |
// (c) 2016 November Five BVBA | |
// | |
#import "NSObject+objcruntime.h" | |
#pragma mark - NSObject objcruntime Category Implementation - | |
@implementation NSObject (objcruntime) | |
#pragma mark Access iVars | |
+(NSArray*)objcruntime_getIvarNames | |
{ | |
Class class = [self class]; | |
NSMutableArray* names = [NSMutableArray new]; | |
uint count; | |
Ivar* ivars = class_copyIvarList(class, &count); | |
for (NSUInteger i = 0; i < count; ++i) | |
{ | |
Ivar ivar = ivars[i]; | |
NSString* ivarName = [NSString stringWithUTF8String:ivar_getName(ivar)]; | |
if (ivarName) | |
[names addObject:ivarName]; | |
} | |
free(ivars); | |
return [names copy]; | |
} | |
-(Ivar)objcruntime_getIvarWithName:(NSString*)name | |
{ | |
Ivar ivarForName = NULL; | |
Class class = [self class]; | |
uint count; | |
Ivar* ivars = class_copyIvarList(class, &count); | |
for (NSUInteger i = 0; i < count; ++i) | |
{ | |
Ivar ivar = ivars[i]; | |
NSString* ivarName = [NSString stringWithUTF8String:ivar_getName(ivar)]; | |
if ([ivarName isEqualToString:name]) { | |
ivarForName = ivar; | |
break; | |
} | |
} | |
free(ivars); | |
return ivarForName; | |
} | |
-(id)objcruntime_getObjectForIvarWithName:(NSString*)name | |
{ | |
id anyObject = nil; | |
Ivar ivar = [self objcruntime_getIvarWithName:name]; | |
if (ivar != NULL) | |
anyObject = object_getIvar(self, ivar); | |
return anyObject; | |
} | |
-(id)objcruntime_getObjectForIvar:(Ivar)ivar | |
{ | |
id anyObject = object_getIvar(self, ivar); | |
return anyObject; | |
} | |
-(void)objcruntime_setObject:(id)object forIvarNameWithName:(NSString*)name | |
{ | |
Ivar ivar = [self objcruntime_getIvarWithName:name]; | |
if (ivar != NULL) | |
{ | |
NSString* ivarType = [NSString stringWithUTF8String:ivar_getTypeEncoding(ivar)]; | |
if ([object isKindOfClass:NSClassFromString(ivarType)]) | |
object_setIvar(self, ivar, object); | |
} | |
} | |
-(void)objcruntime_setObject:(id)object forIvar:(Ivar)ivar | |
{ | |
object_setIvar(self, ivar, object); | |
} | |
#pragma mark Access Properties | |
+(NSArray*)objcruntime_getPropertyNames | |
{ | |
Class class = [self class]; | |
NSMutableArray* names = [NSMutableArray new]; | |
uint count; | |
objc_property_t* properties = class_copyPropertyList(class, &count); | |
for (NSUInteger i = 0; i < count; ++i) | |
{ | |
objc_property_t property = properties[i]; | |
NSString* propertyName = [NSString stringWithUTF8String:property_getName(property)]; | |
if (propertyName) | |
[names addObject:propertyName]; | |
} | |
free(properties); | |
return [names copy]; | |
} | |
#pragma mark Access Methods | |
+(NSArray*)objcruntime_getMethodNames | |
{ | |
Class class = [self class]; | |
NSMutableArray* names = [NSMutableArray new]; | |
uint count; | |
Method* methods = class_copyMethodList(class, &count); | |
for (NSUInteger i = 0; i < count; ++i) | |
{ | |
Method property = methods[i]; | |
SEL methodSelector = method_getName(property); | |
NSString* methodName = NSStringFromSelector(methodSelector); | |
if (methodName) | |
[names addObject:methodName]; | |
} | |
free(methods); | |
return [names copy]; | |
} | |
#pragma mark Associated Objects | |
-(void)objcruntime_setAssociatedObject:(id)object forKey:(NSString*)aKey policy:(objc_AssociationPolicy)policy | |
{ | |
if (aKey) | |
objc_setAssociatedObject(self, (__bridge CFStringRef)aKey, object, policy); | |
} | |
-(void)objcruntime_removeAssociatedObjectForKey:(NSString*)aKey | |
{ | |
if (aKey) | |
objc_setAssociatedObject(self, (__bridge CFStringRef)aKey, nil, OBJC_ASSOCIATION_ASSIGN); | |
} | |
-(id)objcruntime_getAssociatedObjectForKey:(NSString*)aKey | |
{ | |
id associatedObject = nil; | |
if (aKey) | |
associatedObject = objc_getAssociatedObject(self, (__bridge CFStringRef)aKey); | |
return associatedObject; | |
} | |
-(void)objcruntime_removeAllAssociatedObjects | |
{ | |
objc_removeAssociatedObjects(self); | |
} | |
@end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment