swift中MSHookIvar的求助

42014028AA3E85DF591E7B83B724C29F

箭头标注的地方,会产生崩溃问题,前面几行的MSHookIvar都是ok的,找了很多资料,也没有什么结论。。

  1. 已确认order对象有值
  2. 确认order对象有user_address的ivar存在,并且类型是string

不甚感激!

1 个赞

lldb调试一下吧,光想想不明白的

lldb调试的。。ivar拿出来是有的,MSHookIvar类型转换之后,返回了0x19这种void*格式的数据,访问之后,直接bad access了… ivar是有的,好郁闷

看他为什么返回0x19,整个MSHookIvar就几行代码

是由于是string对象的原因吗?

你手动实现一下MSHookIvar,一个个api检查,看问题出在哪里

也手动实现过MSHookIvar,ivar对象获取到了没问题,objc_getIvar就会直接抛出异常

同在一个坑,蹲一个解答

template <typename Type_>
static inline Type_ &MSHookIvar(id self, const char *name) {
    Ivar ivar(class_getInstanceVariable(object_getClass(self), name));
#if __has_feature(objc_arc)
    void *pointer(ivar == NULL ? NULL : reinterpret_cast<char *>((__bridge void *)self) + ivar_getOffset(ivar));
#else
    void *pointer(ivar == NULL ? NULL : reinterpret_cast<char *>(self) + ivar_getOffset(ivar));
#endif
    return *reinterpret_cast<Type_ *>(pointer);
}

就三个api,在哪一个出错没用lldb跟出来吗,手写一下也行啊

1 个赞

MSHookIvar正常返回了 :sweat_smile: 但是返回的是个无效的内存地址