Skip to content

Instantly share code, notes, and snippets.

@DavidDeBels
Created October 7, 2016 09:33
Show Gist options
  • Save DavidDeBels/b5d68175a02a7e4ba09b9e393ba24908 to your computer and use it in GitHub Desktop.
Save DavidDeBels/b5d68175a02a7e4ba09b9e393ba24908 to your computer and use it in GitHub Desktop.
//
// 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
//
// 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