我们的项目中勾了很多ObjectC的私有API,导致有不少crash。想问一下如何防止这种问题?

2013-05-20 17:09:28 +08:00
 feihu
具体的做法是:会先把objectc的API勾出来,调用我们的写的函数,然后在去调用原来的API。
4766 次点击
所在节点    iDev
16 条回复
fly2never
2013-05-20 17:23:19 +08:00
什么叫勾起来?
offspring
2013-05-20 17:25:57 +08:00
表示看不懂...
coupgar
2013-05-20 17:27:10 +08:00
@fly2never method swizzle 这样的方式吧
thedevil5032
2013-05-20 17:31:17 +08:00
@fly2never
@offspring
猜猜应该是 hook 的意思?

我猜楼主是不是这个意思:
当系统调用一个函数的时候会先经过楼主他们写的,再由楼主他们写的代码去调用原生的?
alexrezit
2013-05-20 17:34:41 +08:00
楼主是这个意思么?
if ([oo respondsToSelector:@selector(xx:)] { ... }
anerevol
2013-05-21 09:25:39 +08:00
楼主是想问为什么会crash? 你要是用的mobileSubstrate hook的话,如果该类没有这个方法也不会crash的, 只是不会调用而已。 觉得crash跟hook本身没关系的,是其他地方的问题吧
alexrezit
2013-05-21 09:52:33 +08:00
@coupgar
你确定这样能上架?
coupgar
2013-05-21 10:51:55 +08:00
@alexrezit 显然不能。
alexrezit
2013-05-21 12:46:33 +08:00
@coupgar
=.= 还以为这样就能呢... 我用 API 都是先判断一下是否 responds, 这样就能在上架应用中调用私有 API 了.
method swizzle 有什么实际应用么?
kshatriya
2013-05-21 17:27:38 +08:00
method swizzle是方法混合器, 通过SEL查IMP, 然后把IMP搅在一起
kshatriya
2013-05-21 17:27:56 +08:00
void Swizzle(Class c, SEL orig, SEL new)
{
Method origMethod = class_getInstanceMethod(c, orig);
Method newMethod = class_getInstanceMethod(c, new);
if(class_addMethod(c, orig, method_getImplementation(newMethod), method_getTypeEncoding(newMethod)))
class_replaceMethod(c, new, method_getImplementation(origMethod), method_getTypeEncoding(origMethod));
else
method_exchangeImplementations(origMethod, newMethod);
}
kshatriya
2013-05-21 17:28:13 +08:00
强烈要求v2ex可以有代码格式化+高亮语法
loading
2013-05-21 17:31:30 +08:00
挂钩都是作恶的开始吧…
kshatriya
2013-05-21 17:32:34 +08:00
crash普通情况下都是发送了空消息导致, 发之前做检查吧

hook一般都是先把orig函数的指针存一份, 然后覆盖, 在返回的时候返回给之前保存的orig函数指针, 只处理入参!别做多余的操作!

好混乱, 语死早啊
wezzard
2013-05-21 21:45:03 +08:00
method swizzling 不能上架麼?
coupgar
2013-05-21 23:29:22 +08:00
@wezzard 没有替换私有方法是可以上架的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/69531

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX