注意:dlopen()一个路径时候要以你本机的路径为准,我的路径为(首先右键你的XCode,然后查看Content):
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.0.sdk/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation
1、NSArray & NSAutoreleasePool 实现
#include <objc/runtime.h> #include <dlfcn.h> #include <stdio.h> int main() { void *sdl_library = dlopen("/System/Library/Frameworks/Foundation.framework/Versions/Current/Foundation", RTLD_LAZY); if (sdl_library == NULL) { printf("Got dlopen error!\n"); } else { printf("dlopen successful!\n"); // Set up an NSAutoreleasePool Class nsautoreleasepool = objc_getClass("NSAutoreleasePool"); id pool = class_createInstance(nsautoreleasepool, 0); SEL initSel = sel_registerName("init"); id poolAfterInit = objc_msgSend(pool, initSel); // Create an NSMutableArray Class nsmutablearray = objc_getClass("NSMutableArray"); // Regular way to create an NSMutableArray, // equivalent to [[NSMutableArray alloc] initWithCapacity: 10] id array = objc_msgSend(nsmutablearray, sel_registerName("alloc")); id arrayAfterInit = objc_msgSend(array, sel_registerName("initWithCapacity:"), 10); // Alternative, shorthand way of creating an NSMutableArray, // equivalent to [NSMutableArray arrayWithCapacity: 10] //id arrayAfterInit = objc_msgSend(nsmutablearray, sel_registerName("arrayWithCapacity:"), 10); // Add an NSString and the nsma class reference to the array objc_msgSend(arrayAfterInit, sel_registerName("addObject:"), @"test"); objc_msgSend(arrayAfterInit, sel_registerName("addObject:"), nsmutablearray); // Print out the length and debug printout NSLog(@"%d", objc_msgSend(arrayAfterInit, sel_registerName("count"))); NSLog(@"%@", arrayAfterInit); } return 0; }
2、Block
(一)
#import <Foundation/Foundation.h> #include <objc/runtime.h> #include <Block.h> #include <dlfcn.h> #include <stdio.h> int main() { void *sdl_library = dlopen("/System/Library/Frameworks/Foundation.framework/Versions/Current/Foundation", RTLD_LAZY); if (sdl_library == NULL) { printf("Got dlopen error!\n"); } else { printf("dlopen successful!\n"); // Set up an NSAutoreleasePool Class nsautoreleasepool = objc_getClass("NSAutoreleasePool"); id pool = class_createInstance(nsautoreleasepool, 0); SEL initSel = sel_registerName("init"); id poolAfterInit = objc_msgSend(pool, initSel); // Create an NSMutableArray Class nsmutablearray = objc_getClass("NSMutableArray"); // Regular way to create an NSMutableArray, // equivalent to [[NSMutableArray alloc] initWithCapacity: 10] id array = objc_msgSend(nsmutablearray, sel_registerName("alloc")); id arrayAfterInit = objc_msgSend(array, sel_registerName("initWithCapacity:"), 10); objc_msgSend(arrayAfterInit, sel_registerName("addObject:"), @"a"); objc_msgSend(arrayAfterInit, sel_registerName("addObject:"), @"b"); objc_msgSend(arrayAfterInit, sel_registerName("addObject:"), @"c"); objc_msgSend(arrayAfterInit, sel_registerName("addObject:"), @"d"); objc_msgSend(arrayAfterInit, sel_registerName("addObject:"), @"e"); objc_msgSend(arrayAfterInit, sel_registerName("addObject:"), @"f"); objc_msgSend(arrayAfterInit, sel_registerName("addObject:"), @"g"); objc_msgSend(arrayAfterInit, sel_registerName("addObject:"), @"h"); objc_msgSend(arrayAfterInit, sel_registerName("addObject:"), @"i"); objc_msgSend(arrayAfterInit, sel_registerName("addObject:"), @"j"); objc_msgSend(arrayAfterInit, sel_registerName("addObject:"), @"k"); objc_msgSend(arrayAfterInit, sel_registerName("addObject:"), @"l"); id b = ^(id x, NSUInteger index, BOOL *stop){ NSLog(@"%@", x); }; NSLog(@"%@", b); objc_msgSend(arrayAfterInit, sel_registerName("enumerateObjectsUsingBlock:"), b); } return 0; }
(二)
#import <Foundation/Foundation.h> #include <objc/runtime.h> #include <Block.h> #include <dlfcn.h> #include <stdio.h> struct __block_literal_1 { void *isa; int flags; int reserved; void (*invoke)(struct __block_literal_1 *, id obj, NSUInteger idx, BOOL *stop); struct __block_descriptor_1 *descriptor; }; // This is the regular C function we are turning into a Block. void __block_invoke_1(struct __block_literal_1 *_block, id obj, NSUInteger idx, BOOL *stop) { NSLog(@"%d: %@", idx, obj); } static struct __block_descriptor_1 { unsigned long int reserved; unsigned long int Block_size; } __block_descriptor_1 = { 0, sizeof(struct __block_literal_1) }; int main() { printf("sizeof(int): %lu\n", sizeof(int)); printf("sizeof(void *): %lu\n", sizeof(void *)); printf("sizeof(void (*)()): %lu\n", sizeof(void (*)())); printf("sizeof(struct __block_descriptor *): %lu\n", sizeof(struct __block_descriptor *)); printf("sizeof(__block_literal_1): %lu\n", sizeof(struct __block_literal_1)); printf("sizeof(__block_descriptor_1): %lu\n", sizeof(struct __block_descriptor_1)); printf(" calculated: %lu\n", sizeof(void*)+sizeof(int)+sizeof(int)+sizeof(void (*)())+sizeof(struct __block_descriptor_1 *)); void *sdl_library = dlopen("/System/Library/Frameworks/Foundation.framework/Versions/Current/Foundation", RTLD_LAZY); if (sdl_library == NULL) { printf("Got dlopen error!\n"); } else { printf("dlopen successful!\n"); // Set up an NSAutoreleasePool Class nsautoreleasepool = objc_getClass("NSAutoreleasePool"); id pool = class_createInstance(nsautoreleasepool, 0); SEL initSel = sel_registerName("init"); id poolAfterInit = objc_msgSend(pool, initSel); // Create an NSMutableArray Class nsmutablearray = objc_getClass("NSMutableArray"); // Regular way to create an NSMutableArray, // equivalent to [[NSMutableArray alloc] initWithCapacity: 10] id array = objc_msgSend(nsmutablearray, sel_registerName("alloc")); id arrayAfterInit = objc_msgSend(array, sel_registerName("initWithCapacity:"), 10); objc_msgSend(arrayAfterInit, sel_registerName("addObject:"), @"a"); objc_msgSend(arrayAfterInit, sel_registerName("addObject:"), @"b"); objc_msgSend(arrayAfterInit, sel_registerName("addObject:"), @"c"); objc_msgSend(arrayAfterInit, sel_registerName("addObject:"), @"d"); objc_msgSend(arrayAfterInit, sel_registerName("addObject:"), @"e"); objc_msgSend(arrayAfterInit, sel_registerName("addObject:"), @"f"); objc_msgSend(arrayAfterInit, sel_registerName("addObject:"), @"g"); objc_msgSend(arrayAfterInit, sel_registerName("addObject:"), @"h"); objc_msgSend(arrayAfterInit, sel_registerName("addObject:"), @"i"); objc_msgSend(arrayAfterInit, sel_registerName("addObject:"), @"j"); objc_msgSend(arrayAfterInit, sel_registerName("addObject:"), @"k"); objc_msgSend(arrayAfterInit, sel_registerName("addObject:"), @"l"); struct __block_literal_1 _block_literal = { &_NSConcreteStackBlock, //&_NSConcreteGlobalBlock, (1<<29), 0, __block_invoke_1, &__block_descriptor_1 }; id b = (id)&_block_literal; NSLog(@"%@", b); objc_msgSend(arrayAfterInit, sel_registerName("enumerateObjectsUsingBlock:"), b); } return 0; }
3、打印Class详情
#include <objc/runtime.h>
#include <dlfcn.h>
#include <stdio.h>
int main(int argc, char **argv) {
dlopen("/System/Library/Frameworks/Foundation.framework/Foundation", RTLD_LAZY);
dlopen("/System/Library/Frameworks/AppKit.framework/AppKit", RTLD_LAZY);
dlopen("/System/Library/Frameworks/Cocoa.framework/Cocoa", RTLD_LAZY);
char * className = argc == 2 ? argv[1] : "NSMutableArray";
Class NSMA = objc_getClass(className);
if (!NSMA) {
printf("Could not load Class: %s\n", className);
return 1;
}
const char *name = class_getName(NSMA);
printf("class_getName: %s\n", name);
int version = class_getVersion(NSMA);
printf("class_getVersion: %d\n", version);
const char *weakIvarLayout = class_getWeakIvarLayout(NSMA);
printf("class_getWeakIvarLayout: %s\n", weakIvarLayout);
BOOL isMetaClass = class_isMetaClass(NSMA);
printf("class_isMetaClass: %s\n", isMetaClass ? "yes" : "no");
// get the metaclass
id metaclass = NSMA->isa;
isMetaClass = class_isMetaClass(metaclass);
printf("class_isMetaClass(isa): %s\n", isMetaClass ? "yes" : "no");
// Look up the Ivars
unsigned int i = 0;
unsigned int numIvars = 999999;
Ivar *ivars = NULL;
ivars = class_copyIvarList(NSMA, &numIvars);
printf("\nNum ivars: %d\n", numIvars);
for (; i<numIvars; i++) {
Ivar ivar = ivars[i];
const char *ivarName = ivar_getName(ivar);
printf(" %s (%s)\n", ivarName, ivar_getTypeEncoding(ivar));
}
free(ivars);
// Copy the Property List
unsigned int numProps = 999999;
objc_property_t *props = NULL;
props = class_copyPropertyList(NSMA, &numProps);
printf("\nNum props: %d\n", numProps);
for (i=0; i<numProps; i++) {
}
free(props);
// Copy Protocol List
unsigned int numProtocols = 9999999;
Protocol **ps = class_copyProtocolList(NSMA, &numProtocols);
printf("\nNum Protocols: %d\n", numProtocols);
for (i=0; i<numProtocols; i++) {
Protocol *p = ps[i];
printf(" %s\n", protocol_getName(p));
}
free(ps);
// Copy Method List (instance methods)
unsigned int numMethods = 99999999;
Method * methods = NULL;
methods = class_copyMethodList(NSMA, &numMethods);
printf("\nNum Instance Methods: %d\n", numMethods);
for (i=0; i<numMethods; i++) {
Method m = methods[i];
SEL name = method_getName(m);
printf(" %s (%s)\n", sel_getName(name), method_getTypeEncoding(m));
}
free(methods);
// Copy Method List (class methods)
numMethods = 0;
methods = NULL;
methods = class_copyMethodList(metaclass, &numMethods);
printf("\nNum Class Methods: %d\n", numMethods);
for (i=0; i<numMethods; i++) {
Method m = methods[i];
SEL name = method_getName(m);
printf(" %s (%s)\n", sel_getName(name), method_getTypeEncoding(m));
}
free(methods);
// get superclass
Class superclass = NSMA;
printf("\nWalking inheritance chain:\n");
printf(" %s\n", name);
unsigned int numClasses = 0;
do {
printf(" ");
numClasses++;
superclass = class_getSuperclass(superclass);
for (i=0; i<numClasses; i++) {
printf(" ");
}
printf("↳ %s\n", class_getName(superclass));
} while(superclass);
return 0;
}
4、打印所有协议
#include <objc/runtime.h> #include <dlfcn.h> #include <stdio.h> int main(int argc, char **argv) { dlopen("/System/Library/Frameworks/Foundation.framework/Versions/Current/Foundation", RTLD_LAZY); unsigned int i, n; Protocol **ps = NULL; ps = objc_copyProtocolList(&n); printf("Num Protocols: %d\n", n); // Do stuff with `classes` for (i=0; i<n; i++) { Protocol *p = ps[i]; printf("%s\n", protocol_getName(p)); } free(ps); return 0; }
5、获取某个framework的所有class
#import <Foundation/Foundation.h> #include <objc/runtime.h> #include <dlfcn.h> #include <stdio.h> int main(int argc, char **argv) { dlopen("/System/Library/Frameworks/Foundation.framework/Foundation", RTLD_LAZY); dlopen("/System/Library/Frameworks/AppKit.framework/AppKit", RTLD_LAZY); int i = 0; int numClasses; Class * classes = NULL; numClasses = objc_getClassList(NULL, 0); printf("Num classes: %d\n", numClasses); if (numClasses > 0 ) { classes = malloc(sizeof(Class) * numClasses); numClasses = objc_getClassList(classes, numClasses); // Do stuff with `classes` for (i=0; i<numClasses; i++) { Class c = classes[i]; printf("%s\n", class_getName(c)); } free(classes); } return 0; }
6、HelloWorld
#include <objc/runtime.h> #include <dlfcn.h> #include <stdio.h> int main() { void *sdl_library = dlopen("/System/Library/Frameworks/Foundation.framework/Versions/Current/Foundation", RTLD_LAZY); if (sdl_library == NULL) { printf("Got dlopen error!\n"); } else { printf("dlopen successful!\n"); // Set up an NSAutoreleasePool Class nsautoreleasepool = objc_getClass("NSAutoreleasePool"); id pool = class_createInstance(nsautoreleasepool, 0); SEL initSel = sel_registerName("init"); id poolAfterInit = objc_msgSend(pool, initSel); // Set up a NSString with the contents "Hello World" from a C string Class nsstring = objc_getClass("NSString"); SEL stringUTF8sel = sel_registerName("stringWithUTF8String:"); id hello = objc_msgSend(nsstring, stringUTF8sel, "Hello World\n"); // Print it back out as a C string printf("%s", (char *)objc_msgSend(hello, sel_registerName("UTF8String"))); } return 0; }
7、获取size
#include <objc/runtime.h>
#include <dlfcn.h>
#include <stdio.h>
int main(int argc, char **argv) {
dlopen("/System/Library/Frameworks/Foundation.framework/Foundation", RTLD_LAZY);
dlopen("/System/Library/Frameworks/AppKit.framework/AppKit", RTLD_LAZY);
dlopen("/System/Library/Frameworks/Cocoa.framework/Cocoa", RTLD_LAZY);
char * className = argc == 2 ? argv[1] : "NSMutableArray";
Class NSMA = objc_getClass(className);
if (!NSMA) {
printf("Could not load Class: %s\n", className);
return 1;
}
const char *name = class_getName(NSMA);
printf("class_getName: %s\n", name);
int version = class_getVersion(NSMA);
printf("class_getVersion: %d\n", version);
const char *weakIvarLayout = class_getWeakIvarLayout(NSMA);
printf("class_getWeakIvarLayout: %s\n", weakIvarLayout);
BOOL isMetaClass = class_isMetaClass(NSMA);
printf("class_isMetaClass: %s\n", isMetaClass ? "yes" : "no");
// get the metaclass
id metaclass = NSMA->isa;
isMetaClass = class_isMetaClass(metaclass);
printf("class_isMetaClass(isa): %s\n", isMetaClass ? "yes" : "no");
// Look up the Ivars
unsigned int i = 0;
unsigned int numIvars = 999999;
Ivar *ivars = NULL;
ivars = class_copyIvarList(NSMA, &numIvars);
printf("\nNum ivars: %d\n", numIvars);
for (; i<numIvars; i++) {
Ivar ivar = ivars[i];
const char *ivarName = ivar_getName(ivar);
printf(" %s (%s)\n", ivarName, ivar_getTypeEncoding(ivar));
}
free(ivars);
// Copy the Property List
unsigned int numProps = 999999;
objc_property_t *props = NULL;
props = class_copyPropertyList(NSMA, &numProps);
printf("\nNum props: %d\n", numProps);
for (i=0; i<numProps; i++) {
}
free(props);
// Copy Protocol List
unsigned int numProtocols = 9999999;
Protocol **ps = class_copyProtocolList(NSMA, &numProtocols);
printf("\nNum Protocols: %d\n", numProtocols);
for (i=0; i<numProtocols; i++) {
Protocol *p = ps[i];
printf(" %s\n", protocol_getName(p));
}
free(ps);
// Copy Method List (instance methods)
unsigned int numMethods = 99999999;
Method * methods = NULL;
methods = class_copyMethodList(NSMA, &numMethods);
printf("\nNum Instance Methods: %d\n", numMethods);
for (i=0; i<numMethods; i++) {
Method m = methods[i];
SEL name = method_getName(m);
printf(" %s (%s)\n", sel_getName(name), method_getTypeEncoding(m));
}
free(methods);
// Copy Method List (class methods)
numMethods = 0;
methods = NULL;
methods = class_copyMethodList(metaclass, &numMethods);
printf("\nNum Class Methods: %d\n", numMethods);
for (i=0; i<numMethods; i++) {
Method m = methods[i];
SEL name = method_getName(m);
printf(" %s (%s)\n", sel_getName(name), method_getTypeEncoding(m));
}
free(methods);
// get superclass
Class superclass = NSMA;
printf("\nWalking inheritance chain:\n");
printf(" %s\n", name);
unsigned int numClasses = 0;
do {
printf(" ");
numClasses++;
superclass = class_getSuperclass(superclass);
for (i=0; i<numClasses; i++) {
printf(" ");
}
printf("↳ %s\n", class_getName(superclass));
} while(superclass);
return 0;
}
#import <Foundation/Foundation.h> #include <objc/runtime.h> #include <dlfcn.h> #include <stdio.h> int main() { void *sdl_library = dlopen("/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.0.sdk/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation", RTLD_LAZY); if (sdl_library == NULL) { printf("Got dlopen error!\n"); } else { printf("dlopen successful!\n"); } printf("sizeof(Class): %lu\n", sizeof(Class)); printf("sizeof(Method): %lu\n", sizeof(Method)); printf("sizeof(unsigned long int): %lu\n", sizeof(unsigned long int)); printf("sizeof(struct int, void*): %lu\n", sizeof(struct test { int test; void * ptr; })); printf("sizeof(struct int, int, void*): %lu\n", sizeof(struct test2 { int test; int test2; void * ptr; })); printf("sizeof(struct void*, int, int, void*): %lu\n", sizeof(struct test3 { void *ptr2; int test2; void * ptr; })); return 0; }
8、捕获异常
#include <objc/runtime.h> #include <objc/objc-exception.h> #include <dlfcn.h> #include <stdio.h> void uncaughtExceptionHandler (id exception) { fprintf(stderr, "Inside uncaughtException handler!!!!\n"); fprintf(stderr, "Exception Type: %s\n", (const char *)objc_msgSend(objc_msgSend(exception, sel_registerName("name")), sel_registerName("UTF8String"))); fprintf(stderr, "Exception Reason: %s\n", (const char *)objc_msgSend(objc_msgSend(exception, sel_registerName("reason")), sel_registerName("UTF8String"))); } int main() { void *sdl_library = dlopen("/System/Library/Frameworks/Foundation.framework/Versions/Current/Foundation", RTLD_LAZY); if (sdl_library == NULL) { printf("Got dlopen error!\n"); } else { printf("dlopen successful!\n"); // Set up an NSAutoreleasePool Class nsautoreleasepool = objc_getClass("NSAutoreleasePool"); id pool = class_createInstance(nsautoreleasepool, 0); SEL initSel = sel_registerName("init"); id poolAfterInit = objc_msgSend(pool, initSel); // Set up an uncaughtException handler objc_setUncaughtExceptionHandler((objc_uncaught_exception_handler)uncaughtExceptionHandler); // Intentionally throw an exception, by sending a bad selector to an object Class nsobject = objc_getClass("NSObject"); SEL badSel = sel_registerName("badSelector"); objc_msgSend(nsobject, badSel); } return 0; }
9、设备当前运行的进程
- (NSArray *)runningProcesses { int mib[4] = {CTL_KERN,KERN_PROC, KERN_PROC_ALL, 0}; size_t miblen = 4; size_t size; int st = sysctl(mib, miblen,NULL, &size, NULL, 0); struct kinfo_proc * process =NULL; struct kinfo_proc * newprocess =NULL; do { size += size / 10; newprocess = realloc(process, size); if (!newprocess){ if (process){ free(process); } return nil; } process = newprocess; st = sysctl(mib, miblen, process, &size,NULL, 0); } while (st == -1 &&errno == ENOMEM); if (st == 0){ if (size % sizeof(structkinfo_proc) == 0){ int nprocess = size / sizeof(struct kinfo_proc); if (nprocess){ NSMutableArray * array = [[NSMutableArrayalloc] init]; for (int i = nprocess -1; i >= 0; i--){ NSString * processID = [[NSStringalloc] initWithFormat:@"%d", process[i].kp_proc.p_pid]; NSString * processName = [[NSStringalloc] initWithFormat:@"%s", process[i].kp_proc.p_comm]; NSDictionary * dict = [[NSDictionaryalloc] initWithObjects:[NSArrayarrayWithObjects:processID, processName, nil] forKeys:[NSArray arrayWithObjects:@"ProcessID", @"ProcessName",nil]]; [processID release]; [processName release]; [array addObject:dict]; [dict release]; } free(process); return [array autorelease]; } } } return nil; } // 当前运行的进程 NSArray * processes = [selfrunningProcesses]; for (NSDictionary * dictin processes){ NSLog(@"%@ - %@", [dictobjectForKey:@"ProcessID"], [dictobjectForKey:@"ProcessName"]); }