调用objc_msgSend方法在64位下崩溃解决方法

之前一直在非64位机器下测试一切正常的程序,在iPhone5s下无缘无故崩溃。崩溃的位置是调用objc_msgSend时出现。经过一番辛苦搜索终于发现苹果官网上有一段这样的描述:

Dispatch Objective-C Messages Using the Method Function’s Prototype

An exception to the casting rule described above is when you are calling the objc_msgSend function or any other similar functions in the Objective-C runtime that send messages. Although the prototype for the message functions has a variadic form, the method function that is called by the Objective-C runtime does not share the same prototype. The Objective-C runtime directly dispatches to the function that implements the method, so the calling conventions are mismatched, as described previously. Therefore you must cast the objc_msgSend function to a prototype that matches the method function being called.

Listing 2-14 shows the proper form for dispatching a message to an object using the low-level message functions. In this example, thedoSomething: method takes a single parameter and does not have a variadic form. It casts the objc_msgSend function using the prototype of the method function. Note that a method function always takes an id variable and a selector as its first two parameters. After the objc_msgSendfunction is cast to a function pointer, the call is dispatched through that same function pointer.

Listing 2-14  Using a cast to call the Objective-C message sending functions

- (int) doSomething:(int) x { ... }
- (void) doSomethingElse {
   int (*action)(id, SEL, int) = (int (*)(id, SEL, int)) objc_msgSend;
   action(self, @selector(doSomething:), 0);
}

貌似是说不能直接使用objc_msgSend的原型方法来匿名调用,否则会出现异常。结果尝试了上面的方法强制转换成一定的方法后,再次运行没有崩溃了,Luck!!

原文来自:https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaTouch64BitGuide/ConvertingYourAppto64-Bit/ConvertingYourAppto64-Bit.html

时间: 2024-10-12 04:37:47

调用objc_msgSend方法在64位下崩溃解决方法的相关文章

[转]cypress EZ-USB 68013在WIN7 64位下驱动识别方法 && 64位WIN7中禁用驱动程序签名强制

http://blog.hehehehehe.cn/a/17252.htm 1.重启你的电脑.然后开机的时候一直按F8,进入一个界面,我也不知道是什么界面,里面有一项  ”禁止强制驱动认证“  大体是这几个字,大约在倒数某一项.大家自己找. 2.然后开机了,把C:CypressCypress Suite USB 3.4.7Driverinwlhx64目录下的cyusb.inf文件打开,里面的凡是VID_XXXX&PID_XXXX的要改成 VID_04B4&PID_8613. 其中若要驱动6

1-PLSQL developer 连接不上64位Oracle 的解决方法(大招版vs细节版)

PLSQL developer 连接不了oracle的解决方案 Windows 64位下装Oracle 11g 64位,PLSQL Developer使用出现以下问题: 1.Database下拉框为空: 2.强制输入用户名.密码及Database,登录弹出:Initialzation error... || oci.dll... 说明PLSQL Developer并不支持Oracle 64位客户端连接. 解决办法: 1.下载Oracle客户端Instant Client官网下载地址:http:/

CentOS 5 上使用yum同时安装32位和64位包的解决方法

在centos上使用yum在线安装软件包的时候,有时候会同时安装32位和64位的包.并且在update的时候也会更新双份. 其实让yum只安装64位的包,只要在 /etc/yum.conf 中加个 exclude 选项: [main] cachedir=/var/cache/yum keepcache=0 plugins=1 ...... exclude=*.i?86 exclude 选项支持正则表达式,*.i?86可以用来过滤掉i386,i686等32bit包. 如果要删除已经安装的32bit

(八十三)第三方类库不支持64位处理器的解决方法

当Xcode编译提示Undefined symbol for architecture x86_64时,说明当前框架不支持64位系统,要使用该框架,只需要修改工程设置即可. 打开Build Settings,选择Architecture标签,按照下面的图片设置:在ARCHS_STANDARD后面加_32_BIT 版权声明:本文为博主原创文章,未经博主允许不得转载.

64位下的InlineHook

目录 x64下手工HOOK的方法 一丶HOOK的几种方法之远跳 1. 远跳 不影响寄存器 + 15字节方法 2.远跳 影响寄存器 + 12字节方法 3.影响寄存器,恢复寄存器 进行跳转. 4. 常用 jmp + rip方式跳转 大小6个字节 二丶Call的几种方式. 1. CALL PUSH + RET 方式 2.正常call x64下手工HOOK的方法 关于64位程序.网上HOOK方法一大堆.这里也记录一下. 了解跨平台HOOK的真相与本质. 一丶HOOK的几种方法之远跳 1. 远跳 不影响寄

win8 64位下myeclipse 10.x 自定义JVM无法启动的解决方法

近段时间在win8 64开始慢慢普及,以及其它原因,有很多童鞋都开始使用WIN8: 我的机器是某品牌机的笔记本,由于自带所谓的正版,故一直用着win8,也慢慢习惯,但发现了个好奇怪的问题. 问题便是myeclipse 10.x在win8 64位下,如果在启动参数(myeclipse.ini)自定义设置jvm,即不使用myeclipse自带的jvm,自个定义-vm或根据环境变量jvm,便会无法启动,无论是选择64 . 32myeclipse安装均如此, 当然这里的jvm与myeclipse64.3

window 7 64位下可运行的递归删除注册表程序

为了完成一个简单的注册表删除程序,由于我本身是win7 64位的OS,写了以下代码来递归删除注册表键值,程序代码如下: #include <tchar.h> #include <afx.h> #define KEY_WOW64_64KEY 256 long DeleteSubKeyTree(HKEY hKey, LPCTSTR lpSubKey) { LONG lResult; HKEY hSubKey; DWORD dwIndex, cbName; char szSubKey[5

windows7旗舰版64位下安装、破解及运行QTP11报错

说明:如果你出现了以下几种情况,希望能解决你的问题:如果没有,就当路过. 1.安装qtp11时报vc++ 2005缺少,但怎么也不能成功安装 解决方法: 1.找到qtp安装包里面的vc++ 2005组件 QuickTest\CHS\prerequisites\vc2005_sp1_redist. 2.运行vcredist_x86.exe文件,如果安装失败,修改后缀名为压缩文件,如:zip.rar,解压文件后重新运行解压后的文件. 2.网上介绍用mgn-mqt82.exe的方法破解qtp11失败

64位下pwntools中dynELF函数的使用

这几天有同学问我在64位下怎么用这个函数,于是针对同一道题写了个利用dynELF的方法 编译好的程序 http://pan.baidu.com/s/1jImF95O 源码在后面 from pwn import * elf = ELF('./pwn_final') got_write = elf.got['write'] print 'got_write= ' + hex(got_write) call_get_name_func = 0x400966 print 'call_get_name_f