Objective-C 再谈OC指针,对比C++/Java/Swift
1.Objective-C的指针
OC一直是人感觉比较变态的一门语言,为什么呢?因为它的每个变量都是指针型,多的都几乎让人忘了那个*的存在了。
比如我定义了一个Student的Class,new了stu1和stu2,并把stu2=stu1,那当两者任何一个进行修改时,两个变量的内容都会修改。
Student *stu1=[[Student alloc]init];
stu1.name=@"stu1";
Student *stu2=stu1;
stu2.name=@"stu2";
NSLog(@"STU1:%@----STU2:%@",stu1.name,stu2.name);//输出两个都是stu2
在C/C++语言里,不习惯用指针作变量的情况下,当然两者是不一样的,实际上“=”号是做了一份拷贝。
Student stu1;
stu1.name="stu1";
Student stu2=stu1;
stu2.name="stu2";
cout<<"stu1:"<<stu1.name<<" stu2:"<<stu2.name<<endl;//输出前者stu1,后者stu2
但是上面的情况创建的是C/C++语言里所谓的栈对象,但栈的大小很有限
在创建堆对象(指针对象)的情况下,就和OC十分相似了
Student *stu1= new Student();
stu1->name="stu1"; Student *stu2=stu1;
stu2->name="stu2";
cout<<"stu1:"<<stu1->name<<" stu2:"<<stu2->name<<endl;//输出两个都是stu2
在Java里面,虽然变量的创建前面没有*,但其实默认生成的也是堆对象,对象给变量赋值只是一个引用。
在Swift中,通过下面的=赋值,和Java中一样,stu2是stu1的引用
import Foundation var stu1=Student(name: "shen")
var stu2=stu1
print("stu1:\(stu1)---stu2:\(stu2)")//两者的地址是一样的
我觉得一句话可以概括这种存储方式:“栈存变量,堆存对象”,这种方式很好的利用了栈的存取速度快的特点,堆存量大的特点。
有点像我装了一个固态硬盘和机械硬盘,然后把应用程序都装固态硬盘里,文件都存在机械硬盘里,然后每次打开应用,文件都是从机械硬盘读取的。
2.NSString的错觉
但是对NSString,我们容易产生错觉,比如我这样写:
NSString *str1=@"str1";
NSString *str2=str1;
str2=@"str2";
NSLog(@"str1:%@----str2:%@",str1,str2);//输出前者str1,后者str2
为毛str2的修改还是不影响str1呢?说好的指针呢?这是因为通过=@""方式赋值,事实上已经重新开辟了内存,然后让str2指向这个新地方,所以str2的修改肯定就不会影响str1。这里需要注意下的是,NSString对象是直接存在栈里面的。很多基本的数据类型都会存在栈里,这样加快访问速度。
可以通过输出指针所在地址和指针指向地址来进行分析:
NSString *str1=@"str1";
NSString *str2=str1;
NSLog(@"str1:%p----str2:%p",str1,str2);//内容地址,显示一样,说明都指向@“str1” str2=@"str2";
NSLog(@"str1:%p----str2:%p",str1,str2);//内容地址,显示不一样,说明str1所指内容不变,str2所指内容已经变化 NSLog(@"str1:%@----str2:%@",str1,str2);//输出前者str1,后者str2
以下的方法,实际上也都并不是拷贝一份,因为编译器对此做了优化,使几个指针变量指向的同一个内存区域
NSString *string1=@"hello";
NSString *string2 = [[NSString alloc]initWithString:string1];
NSString *string3 = [NSString stringWithString:string1];
可见,NSString类变量都是遵循这样的准则:"指针A赋值给指针B,两者指向同一块内存,修改后重新指向开辟新内存"
Objective-C 再谈OC指针,对比C++/Java/Swift的更多相关文章
- [转载]再谈百度:KPI、无人机,以及一个必须给父母看的案例
[转载]再谈百度:KPI.无人机,以及一个必须给父母看的案例 发表于 2016-03-15 | 0 Comments | 阅读次数 33 原文: 再谈百度:KPI.无人机,以及一个必须 ...
- C++ Primer 学习笔记_32_STL实践与分析(6) --再谈string类型(下)
STL实践与分析 --再谈string类型(下) 四.string类型的查找操作 string类型提供了6种查找函数,每种函数以不同形式的find命名.这些操作所有返回string::size_typ ...
- C++ Primer 学习笔记_44_STL实践与分析(18)--再谈迭代器【下】
STL实践与分析 --再谈迭代器[下] 三.反向迭代器[续:习题] //P355 习题11.19 int main() { vector<int> iVec; for (vector< ...
- [转载]再谈PostgreSQL的膨胀和vacuum机制及最佳实践
本文转载自 www.postgres.cn 下的文章: 再谈PostgreSQL的膨胀和vacuum机制及最佳实践http://www.postgres.cn/news/viewone/1/390 还 ...
- 再谈HTTP2性能提升之背后原理—HTTP2历史解剖
即使千辛万苦,还是把网站升级到http2了,遇坑如<phpcms v9站http升级到https加http2遇到到坑>. 因为理论相比于 HTTP 1.x ,在同时兼容 HTTP/1.1 ...
- 再谈Transaction——MySQL事务处理分析
MySQL 事务基础概念/Definition of Transaction 事务(Transaction)是访问和更新数据库的程序执行单元;事务中可能包含一个或多个 sql 语句,这些语句要么都执行 ...
- 小数据池 is和== 再谈编码
昨日回顾 上节课内容回顾 1. 字典 {key:value, key:value.....} 成对的保存数据 字典没有索引. 不能切片, 字典的key必须是可哈希的.不可变的 1. 增加: dic[新 ...
- 再谈js对象数据结构底层实现原理-object array map set
如果有java基础的同学,可以回顾下<再谈Java数据结构—分析底层实现与应用注意事项>:java把内存分两种:一种是栈内存,另一种是堆内存.基本类型(即int,short,long,by ...
- 再谈 COW、ROW 快照技术
目录 目录 前言 快照与备份的区别 快照技术 增量快照之 COW 增量快照之 row 前言 在经过了一段时间的实践之后,再次回顾 COW/ROW 快照技术的实现原理,温故而知新. 快照与备份的区别 传 ...
随机推荐
- Hibernate hbm2ddl.auto DDL语句 控制台输出的配置
在开发中我们需要知道hbm2ddl.auto生成的SQL语句,来判断代码的正确性,现在记录配置的过程. Hibernate的DDL语句在控制台的输出配置: 一.在lib中确保只有下面的三个相关包:1) ...
- vbs keys
其使用格式为: object.SendKeys string "object":表示WshShell对象 "string":表示要发送的按键指令字符串,需要放在 ...
- Install Visual Studio For Mac Preview
在Hack News上看到Visual Studio For Mac Preview的链接,上面有许多评论,纪录下尝鲜安装过程. 第一次尝试 VisualStudioforMacPreviewInst ...
- PhoneGap: Android 自定义组件
Hello Core Demo Plugin Development(组件部署): http://docs.phonegap.com/en/2.0.0/guide_plugin-development ...
- 页面跳转Transfer与Redirect的区别你知道吗?
一 前言 关于页面跳转的方式常用的应该就是,链接跳转,js跳转,Server.Tranfser和Response.Redirect 这几种,可是在Tranfser与Redirect之间用哪种更好(本文 ...
- RabbitHub开源情况及计划
之前写过一篇".NET 平台下的插件化开发内核(Rabbit Kernel)",已经过去三个月了,期间RabbitHub并不是没有了发展更不是放弃了发展,在RabbitHub中的群 ...
- Linux之我见
Linux哲学之美 linux就像是一个哲学的最佳实践.如果非要对它评价,我真的不知道该怎么赞叹,我只能自豪的说着:“linux的美丽简直让人沉醉.” 我只能说是我处在linux学习的修炼之路上的一个 ...
- android 开发之 百度地图的使用
好久没写博客了,最近遇到个新需求 需要用到百度地图的基础地图,定位,理论上应该还会用到鹰眼的功能吧.具体还很难说.我现在 刚动工,就从头开始记录吧. 首先是先申请一个百度地图api的key 流程官网很 ...
- mysql case when then end学习
表 vtiger_acctive,字段 id,name. 1. 查询中使用 # 查询如果name的值为 hello1 时输出 6666,当值为 hello2 时,输出 333333 select ca ...
- [Bundling and Minification ] 二、绑定的作用
本篇接上一篇[Bundling and Minification ] 一.如何绑定 Bundling的作用有二,一是合并文件减少资源请求的个数缩短资源请求的时间.二是自动更新到最新js或者css,当合 ...