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 快照技术的实现原理,温故而知新. 快照与备份的区别 传 ...
随机推荐
- ORACLE查出表所有的触发器及触发器详细信息
ORACLE查出表所有的触发器及触发器详细信息 一.查all_triggers表得到trigger_name Sql代码 select trigger_name from all_triggers w ...
- Effective java 第2版 - 笔记(01) 单例(Singleton)的枚举(enum)实现
直接上代码: public enum Boss { INSTANCE; private String name; public void doSomeThing() { System.out.prin ...
- javascript:查找“跳号”号码
业务背景:航空货运系统中,“货运代理商”会定期从“航空公司”领取一定数量的纸质运单(每张纸上有一个单号),这些单号都是连续的(即:每次可以理解为领取一个“号段”),而且每张单子都要向航空公司交纳一定的 ...
- 博客搬家。新博客地址 http://fangjian0423.github.io/
以后新的博客会发到 http://fangjian0423.github.io/ 里. 这里基本上不会再更新博客了.
- 我这样理解js里的this
关于this,是很多前端面试必考的题目,有时候在网上看到这些题目,自己试了一下,额,还真的错了!在实际开发中,也会遇到 this 的问题(虽然一些类库会帮我们处理),例如在使用一些框架的时候,例如:k ...
- JSON简介以及用法汇总
什么是JSON? JavaScript 对象表示法(JavaScript Object Notation). JSON是一种轻量级的数据交换格式,某个JSON格式的文件内部譬如可以长成这样: { &q ...
- Java 的世界,我不懂:奇葩的 json 序列化
先上张图,代表我心中的十万头草泥马: 写这么长的代码,头回见数组和单个实体共用同一个 json 节点的! 恐怕只有 java 社区的大牛B 才能做出这等事.. 由 Apache 发布: http:// ...
- flex弹性布局学习笔记
前言 资料来源于网络,本人只是对此作了一下操作,记录于此以便以后查阅.目的在于梳理自己前端凌乱的知识点. 本文根据 Brian Franco 的一个flexbox.scss库来记录 入职新公司前对移动 ...
- WordPress使用固定链接
WordPress安装后我们会发现,文章默认的url是很丑的,http://example.com/?p=N,其中N是文章ID,一串数字.默认链接在所有的环境下都运转良好,但和其他的类型比起来却没那么 ...
- Entity Framework与ADO.Net及NHibernate的比较
Entity Framework 是微软推荐出.NET平台ORM开发组件, EF相对于ado.net 的优点 (1)开发效率高,Entity Framework的优势就是拥有更好的LINQ提供程序. ...