博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NSValue的valueWithBytes:objCType:方法
阅读量:4356 次
发布时间:2019-06-07

本文共 1481 字,大约阅读时间需要 4 分钟。

+ (NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type;

NSValue的valueWithBytes:objCType:方法将参数value指针指向的内容存储到新创建的NSValue对象中,而指针指向的内容类型由type参数指定。比如下面的例子:

char *myCString = "123456789";NSValue *theValue = [NSValue valueWithBytes:myCString objCType:@encode(char *)];        char buffer[10] = {
0};[theValue getValue:buffer];NSLog(@"%s", buffer);

上面代码输出:12345678,而不是123456789。

原因是valueWithBytes:objCType方法保存的是myCString指向的内容(即字符串"123456789"),并且将这个内容当成一个char *指针,而一个指针只有8个字节(具体大小可能因机器而异),所以theValue只能保存字符串的前8个字节,因此,使用NSValue的getValue:方法取出的内容是12345678,而不是123456789。具体流程如下图所示:

 

 要解决这个问题,可以向valueWithBytes:objCType传递myCString变量本身的地址,如下面代码所示:

char *myCString = "123456789";NSValue *theValue = [NSValue valueWithBytes:&myCString objCType:@encode(char *)];        char *buffer = NULL;[theValue getValue:&buffer];NSLog(@"%s", buffer);

这时输出的内容就是:123456789。

上面的代码中,在调用valueWithBytes:objCType之前,各个指针变量指向的值如下图所示:

在上面的图中,变量名上方的数字表示该指针变量存储的地址值,比如,myCString指向字符串123456789,这个字符串的首地址是11111111,buffer变量指向NULL。

调用vaueWithBytes:objCType之后,由于向valueWithBytes:objCType传递的是myCString变量本身的地址&myCString,那么theValue就保存这个地址所指向的内容,即myCString变量保存的地址值11111111,并把这个值当成char *看待。当将buffer变量本身的地址传递给NSValue的getValue方法时,getValue方法将theValue保存的值copy给&buffer指向的缓存区,即copy给buffer变量,因此,buffer变量保存的值就成了11111111,这个值就是字符串123456789的地址,buffer变量就指向了这个字符串。具体流程如下图所示:

 

还需要主意的是,上面代码传递给valueWithBytes:objCType方法的type参数不一定非要是char *,只要是指针类型就可以,因为指针的大小在同一台机器上是固定的。

参考资料

 

转载于:https://www.cnblogs.com/chaoguo1234/p/6279390.html

你可能感兴趣的文章
Hadoop详细配置教程
查看>>
基于Web的数据推送技术(转)
查看>>
Memcached深度分析(转)
查看>>
svn向服务器添加新建文件夹
查看>>
大神解答:如何实现域账号免登陆流程平台的功能
查看>>
HTTP与HTTPS
查看>>
Java操作FTP
查看>>
application下的JDBC操作
查看>>
iphone UI 开发教程
查看>>
解决ASP因为编码问题出现乱码现象:ASP中强制编码方式
查看>>
微信小程序 - 获取所在位置(省、市、区)
查看>>
PHP高级教程-Data
查看>>
POJ-1988-Cube_Stacking-并查集
查看>>
Qapp使用总结
查看>>
Delphi操作XML:函数详解(一)
查看>>
网盘搜索网站汇总
查看>>
第十六章 数组
查看>>
又是一年毕业季
查看>>
ThinkPHP 3.2.3 Widget 扩展的使用
查看>>
(转)同步异步,阻塞非阻塞 和nginx的IO模型
查看>>