NSValue的valueWithBytes:objCType:方法
+ (NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type;
NSValue的valueWithBytes:objCType:方法将参数value指针指向的内容存储到新创建的NSValue对象中,而指针指向的内容类型由type参数指定。比如下面的例子:
char *myCString = "";
NSValue *theValue = [NSValue valueWithBytes:myCString objCType:@encode(char *)]; char buffer[1] = {};
[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 = "";
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://developer.apple.com/reference/foundation/nsvalue/1551466-valuewithbytes?language=objc
NSValue的valueWithBytes:objCType:方法的更多相关文章
- Runtime之成员变量&属性&关联对象
上篇介绍了Runtime类和对象的相关知识点,在4.5和4.6小节,也介绍了成员变量和属性的一些方法应用.本篇将讨论实现细节的相关内容. 在讨论之前,我们先来介绍一个很冷僻但又很有用的一个关键字:@e ...
- OC基础(25)
NSNumber NSValue NSDate NSFileManager *:first-child { margin-top: 0 !important; } body > *:last-c ...
- Foudation框架之一些常用结构体和常用类
表示范围作用的结构体:NSRange: 有三种方式创建新的NSRange: 1.NSRange range: range.location = 17; ...
- 【IOS】IOS高速入门之OC语法
Objective-C 是 C 语言的超集 您还能够訪问标准 C 库例程,比如在stdlib.h和stdio.h中声明的那些例程. Objective-C 还是一种很动态的程序设计语言,并且这样的动态 ...
- OC-基础数据类型
七 字符串与基本数据类型转换 获取字符串的每个字符/字符串和其他数据类型转换 八 NSMutableString 基本概念/常用方法 九 NSArray NSArray基本概念/创建方式/注意事项/常 ...
- Objective-C中@encode的使用
今天看Mansonry的代码时,碰到一个生僻的关键字(也许只是自己没用过).:-) @encode => 将给定类型编码为内部表示的字符串. 为了方便自己查阅,顺便也写个小例子,贴在这里,实践 ...
- javaSE27天复习总结
JAVA学习总结 2 第一天 2 1:计算机概述(了解) 2 (1)计算机 2 (2)计算机硬件 2 (3)计算机软件 2 (4)软件开发(理解) 2 (5) ...
- Objective-C( Foundation框架 一 NSNumber(NSValue))
NSNumber: 是OC中处理数字的一个类 NSValue是NSNumber的子类 如何处理: 把int,float,double 包装成一个对象 使用NSNumber的好处: 可以把基本数据类型 ...
- NSDate,NSNumber,NSValue
NSDate #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleas ...
随机推荐
- Eclipse易卡死
在用eclipse编辑项目的时候,经常卡死,经过查询知道原来是我的JDK和eclipse版本对应的不好,我们都知道,eclipse的环境需要配置. 当时情况是这样的 2.容易出现卡死或者如图所示的情况 ...
- mongodb数据的导出和导入
mongo导出表说明: root@827995de7c7f:/# mongoexport --help Usage: mongoexport <options> Export data f ...
- python3.X 安装web.py 失败的解决方法
python2.x 安装python是非常顺利的 但是 在进行 pip3 install web.py 时提示很多错误 例如缺少模块 语法错误...... 最后试了一下web.py 的dev版本 pi ...
- JVM培训序幕篇
明天老王要给我们讲JVM的知识,提前发了一个小Demo给我们看,代码如下: package demo; import java.util.*; public class Demo { public s ...
- GeekOS课程设计-project1
参考:https://blog.csdn.net/qq_35008279/article/details/78984561?tdsourcetag=s_pcqq_aiomsg 补充:如果按照参考博客还 ...
- 【EXCEL】XMLファイルを開く方法(XML文件打开方法)
前言 XMLとは:Extensible Markup Language(エクステンシブル マークアップ ランゲージ)は.基本的な構文規則を共通とすることで.任意の用途向けの言語に拡張することを容易とし ...
- 快速创建一个vue项目
vue脚手架 用来创建vue项目的工具包 创建项目: npm install -g vue-cli vue init webpack VueDemo 开发环境运行: cd VueDemo npm in ...
- JavaScript---复选框全选的多种实现
<script language=javascript> //第一种方法 function selectall1() { var a = document.getElementsBy ...
- VIO概述 On-Manifold Preintegration for Real-Time Visual--Inertial Odometry
目前的研究方向可以总结为在滤波算法中实现高精度,在优化算法中追求实时性.当加入IMU后,研究方向分为松耦合和紧耦合,松耦合分别单独计算出IMU测量得到的状态和视觉里程计得到的状态然后融合,紧耦合则将I ...
- Ruby数据类型
数字类型 书写整数时,可以根据需要在整数之间任意加入下划线而不会影响数字的值 a=123_45_78 puts a # => 12345678 to_i 截掉小数点之后的数字取整 内置Math模 ...