小编Eam*_*ney的帖子

Objective-c NSArray和NSMutableArray的内部结构

对于所有进入Objective-c内部的人来说非常有趣的问题......

所以... NSObject返回copy对于对象和类(如我所料)的相同实现.但是,NSArray并且不仅NSMutableArray返回objectAtIndex:对象和类的不同实现,而且每个对象具有不同的实现.

有谁知道为什么跟随代码产生这样的行为?...(至少是类的实现NSArrayNSMutableArray是相同的:))

NSObject *obj = [[[NSObject alloc] init] autorelease];
NSLog(@"NSObject instance %@", [NSValue valueWithPointer:method_getImplementation(class_getInstanceMethod(object_getClass(obj), @selector(copy)))]);
NSLog(@"NSObject class %@", [NSValue valueWithPointer:method_getImplementation(class_getInstanceMethod([NSObject class], @selector(copy)))]);

NSArray *array = [[[NSArray alloc] init] autorelease];
NSLog(@"NSArray instance %@", [NSValue valueWithPointer:method_getImplementation(class_getInstanceMethod(object_getClass(array), @selector(objectAtIndex:)))]);
NSLog(@"NSArray class %@", [NSValue valueWithPointer:method_getImplementation(class_getInstanceMethod([NSArray class], @selector(objectAtIndex:)))]);

NSMutableArray *array1 = [[[NSMutableArray alloc] init] autorelease];
NSLog(@"NSMutableArray instance %@", [NSValue valueWithPointer:method_getImplementation(class_getInstanceMethod(object_getClass(array1), @selector(objectAtIndex:)))]);
NSLog(@"NSMutableArray class %@", [NSValue valueWithPointer:method_getImplementation(class_getInstanceMethod([NSMutableArray class], @selector(objectAtIndex:)))]);
Run Code Online (Sandbox Code Playgroud)

日志

2012-11-06 16:35:22.918 …
Run Code Online (Sandbox Code Playgroud)

iphone objective-c ios

8
推荐指数
1
解决办法
1382
查看次数

dlopen 有没有办法在 iOS 上重新加载 dylib 文件?

正如标题所说......我对dlopen(). 我知道应用商店不允许这样做,但我对 iOS 上的这个感到好奇。

我的问题是我可以创建一个 .dylib 文件,我可以在运行时使用以下代码加载这个文件

char *dylibPath = "/Applications/myapp.app/mydylib2.dylib";

void *libHandle = dlopen(dylibPath, RTLD_NOW);
if (libHandle != NULL) {
    NSString * (*someMethod)() = dlsym(libHandle, "someMethod");
    if (someMethod != NULL)  {
        NSLog(someMethod());
    }
    dlclose(libHandle);
}
Run Code Online (Sandbox Code Playgroud)

这是取自这里

我遇到的问题是,如果我更改 mydylib2.dylib,dlopen则不会加载重新编译的 .dylib 文件。相反,它解析旧版本的函数someMethod

例如,如果someMethod第一次返回@"Hello"并且我将其更改为@"Hello World"并重新编译,则上面的代码将始终返回,@"Hello"直到我在模拟器中重新启动应用程序。

有谁知道为什么会这样?并建议一个解决方法,以便可以在运行时重新加载这个 .dylib?

dylib dlopen ios

6
推荐指数
1
解决办法
2877
查看次数

标签 统计

ios ×2

dlopen ×1

dylib ×1

iphone ×1

objective-c ×1