In today’s post I’m going to show you some basic reflection in Objective-C. To start off, lets take a look at probably the most common use case for reflection:
Finding the type of an object
C#:Type t = typeof(MyClass); Objective-C:Class c = [MyClass class];As you can see, in Objective-C we use the keyword “Class” instead of Type. Also we’re accessing a static method off of the class as opposed to calling a method and passing in the class.
Get the type of an instantiated object:
C#:Type t = myObj.GetType(); Objective-C:Class c = myObj.class;Again, there isn’t much different here. Basically we just access a property called “class” as opposed to calling a method.
Now lets look at how you would check to see if a class derives from a certain type.
C#:bool x = self is Window; Objective-C:BOOL x = [self isKindOfClass:[UIView class]];And to see if a class implements a interface/protocol:
C#:bool x = this is IEnumerable; Objective-C:BOOL x = [self conformsToProtocol:@protocol(IGGridViewDataSource)];Lets move on to a more advanced topics.
Find all properties on a objectC#:using System. Reflection; PropertyInfo[] props = myObj.GetType().GetProperties();foreach(PropertyInfo pi in props){ string actualName = pi.name;} Objective-C:#import <objc/runtime.h> objc_property_t *properties = class_copyPropertyList([myObj class], &outCount); for(i = 0; i < outCount; i++){ objc_property_t property = properties[i]; const char* name = property_getName(property); NSString* actualName = [NSString stringWithUTF8String:name];} Access a property on an object, with just a nameC#:object val = myObj.GetType().GetProperty(“PropertyName”).GetValue(myObj, null); Objective-C:id val = [myObj valueForKey:@"propName"]; Invoke a method off an object, with just a nameC#:object val = myObj.GetType().GetMethod(“MethodWithParam”).Invoke(myObj, new object[]{“param”}); Objective-C: SEL method = NSSelectorFromString(@”methodWithParam:”);id val = [myObj performSelector:method withObject:@"param"];And thats a look at some basic reflection.
If you found this helpful, check out the rest of this series so far.
-SteveZ