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的更多相关文章

  1. [转载]再谈百度:KPI、无人机,以及一个必须给父母看的案例

    [转载]再谈百度:KPI.无人机,以及一个必须给父母看的案例 发表于 2016-03-15   |   0 Comments   |   阅读次数 33 原文: 再谈百度:KPI.无人机,以及一个必须 ...

  2. C++ Primer 学习笔记_32_STL实践与分析(6) --再谈string类型(下)

    STL实践与分析 --再谈string类型(下) 四.string类型的查找操作 string类型提供了6种查找函数,每种函数以不同形式的find命名.这些操作所有返回string::size_typ ...

  3. C++ Primer 学习笔记_44_STL实践与分析(18)--再谈迭代器【下】

    STL实践与分析 --再谈迭代器[下] 三.反向迭代器[续:习题] //P355 习题11.19 int main() { vector<int> iVec; for (vector< ...

  4. [转载]再谈PostgreSQL的膨胀和vacuum机制及最佳实践

    本文转载自 www.postgres.cn 下的文章: 再谈PostgreSQL的膨胀和vacuum机制及最佳实践http://www.postgres.cn/news/viewone/1/390 还 ...

  5. 再谈HTTP2性能提升之背后原理—HTTP2历史解剖

    即使千辛万苦,还是把网站升级到http2了,遇坑如<phpcms v9站http升级到https加http2遇到到坑>. 因为理论相比于 HTTP 1.x ,在同时兼容 HTTP/1.1 ...

  6. 再谈Transaction——MySQL事务处理分析

    MySQL 事务基础概念/Definition of Transaction 事务(Transaction)是访问和更新数据库的程序执行单元;事务中可能包含一个或多个 sql 语句,这些语句要么都执行 ...

  7. 小数据池 is和== 再谈编码

    昨日回顾 上节课内容回顾 1. 字典 {key:value, key:value.....} 成对的保存数据 字典没有索引. 不能切片, 字典的key必须是可哈希的.不可变的 1. 增加: dic[新 ...

  8. 再谈js对象数据结构底层实现原理-object array map set

    如果有java基础的同学,可以回顾下<再谈Java数据结构—分析底层实现与应用注意事项>:java把内存分两种:一种是栈内存,另一种是堆内存.基本类型(即int,short,long,by ...

  9. 再谈 COW、ROW 快照技术

    目录 目录 前言 快照与备份的区别 快照技术 增量快照之 COW 增量快照之 row 前言 在经过了一段时间的实践之后,再次回顾 COW/ROW 快照技术的实现原理,温故而知新. 快照与备份的区别 传 ...

随机推荐

  1. MFC 调试方法

    AfxDebugBreak     MFC 提供特殊的 AfxDebugBreak 函数,以供在源代码中对断点进行硬编码:     AfxDebugBreak( ); 在 Intel 平台上,AfxD ...

  2. 翻译qmake文档(一) qmake指南和概述

    翻译qmake文档 目录 英文文档连接: http://qt-project.org/doc/qt-5/qmake-manual.html http://qt-project.org/doc/qt-5 ...

  3. servlet乱码问题总结

    在学习时servlet乱码问题还是挺严重的,总结一下有三种情况 1.新建HTML页面后浏览出现乱码 2.以post形式请求时出现乱码 3.以get形式请求时出现乱码 让我们一个一个来解决吧 1.新建H ...

  4. 开源Asp.Net Core小型社区系统

    源码地址:Github 前言 盼星星盼月亮,Asp.Net Core终于发布啦!! Asp.Net发布时我还在上初中,没有赶上.但是Asp.Net Core我从beta版本便一直关注.最初项目名叫As ...

  5. 基于DDD的.NET开发框架 - ABP模块设计

    返回ABP系列 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应 ...

  6. Linux进程间通信之共享内存

    一,共享内存  内核管理一片物理内存,允许不同的进程同时映射,多个进程可以映射同一块内存,被多个进程同时映射的物理内存,即共享内存.  映射物理内存叫挂接,用完以后解除映射叫脱接. 1,共享内存的特点 ...

  7. web安全——应用(java)

    简介 由于网络技术日趋成熟,黑客们也将注意力从以往对网络服务器的攻击逐步转移到了对web应用的攻击.据最新调查,信息安全有75%都发生在web应用而非网络层面. 场景 控制访问的权限.只让可以访问的访 ...

  8. nodepad++快捷键收集

    Notepad++ 快捷键 大全Ctrl+C 复制Ctrl+X 剪切Ctrl+V 粘贴Ctrl+Z 撤消Ctrl+Y 恢复Ctrl+A 全选Ctrl+F 键查找对话框启动Ctrl+H 查找/替换对话框 ...

  9. SVG的使用

    一,svg可以在浏览器中直接打开 二,在html使用<img/>标签引用 三,直接在html中使用svg标签 四,作为css背景 SVG支持ie9+ ,chrome 33.0+,firef ...

  10. 开发错误记录10: Butterknife8.1.0 提示NullPointerException空指针

    Butterknife 8.0以后的版本在引入到项目中有变动,按之前的引入方式之后, 会报 空指针! 正确的引入方法是:(在官方的文件上有说明的,记录是为了方便下次引入,直接复制到项目) 在项目的.g ...