Foundation框架之可变和不可变

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

学习过OC的都应该知道,在OC中有一个单词 “Mutable”,它的意思是可变的。

那什么是可变,什么是不可变呢?

首先先了解一下什么是Foundation框架

Foundation框架是IOS/MAC中其他框架的基础,Foundation类层次的根是NSObject类,它(和NSObject及NSCopying协议一起)定义了基本的对象属性和行为。Foundation框架的剩余部分由几组相互关联的类和一些独立的类组成。有一些代表基本数据类型的类,如字符串、字节数组、用于存储其它对象的集合类;一些代表系统信息的类,如日期类;还有一些代表系统实体的类,比如端口、线程、和进程。

如何使用Foundation框架

直接引用头文件即可,是不是很简单。

#import <Foundation/Foundation.h>

接下来我们来看看在Foundation框架中有哪些常见的可变和不可变,

NSString———————————————>NSMutableString

NSArray———————————————>NSMutableArray

NSDictionary—————————————>NSMutableDictionary

NSString是OC中核心处理字符串的类之一,它是一个类。

NSMutableString类,继承了NSString类,它可以使用NSString类的所有方法。

NSString是不可变的,里边的文字内容是不能改变的。

NSMutableString是可变的,它可以任意的在字符串中添加,删除,和插入字符。


字符串的可变和不可变

不可变:指的是字符串在内存中占用的存储空间固定,并且存储的内容不能发生变化。

可变:指的是字符串在内存中占据的存储空间可以不固定,并且存储的内容可以被修改。


    //不可变字符串
    NSString *s = @"aaaaaaa";
    NSLog(@"%@\t%p",s,s);   //aaaaaaa	0x100001048
    
    //给s赋值一个新值
    s = @"fffffff";
    NSLog(@"%@\t%p",s,s);   //fffffff	0x100001088
上面创建了一个不可变的字符串,当我们给s 重新赋值后,我们通过打印s 的值和地址来测试,此时我们发现s 的值和地址都方法了变化.这说明我们在第二次赋值的时候,在内存中又开辟了一块新的存储空间来存储"fffffff",那么此时并不是字符串"aaaaaaa"发生了变化,而是我们让s  重新指向了另一块内存空间。

        //可变字符串                                               012345678
        NSMutableString *s1 = [NSMutableString stringWithFormat:@"bbcedbbb"];
        NSLog(@"%@\t%p",s1,s1); //bbcedbbb	0x100200390
        
        //调用可变字符串的appendString方法
        [s1 appendString:@"cccccccc"];
        NSLog(@"%@\t%p",s1,s1); //bbcedbbbcccccccc	0x100200390
        
        //调用可变字符串的deleteCharactersInRange方法
        [s1 deleteCharactersInRange:NSMakeRange(2, 3)];
        NSLog(@"%@\t%p",s1,s1); //bbbbbcccccccc	0x100200390
        
        //插入一个字符串
        [s1 insertString:@"chengxuyuan" atIndex:2];
        //0123456789..............
        NSLog(@"%@\t%p",s1,s1); //bbchengxuyuanbbbcccccccc	0x100200390
        
        //替换字符串
        [s1 replaceCharactersInRange:NSMakeRange(7, 4) withString:@"#$%*"];
        NSLog(@"%@\t%p",s1,s1); //bbcheng#$%*anbbbcccccccc	0x100200390

上面创建了一个可变字符串 s1的 ,此时我们调用 s1 的 appendString、deleteCharactersInRange、insertString、replaceCharactersInRange等方法进行操作,我们还是通过打印字符串的值和地址来比较,此时我们发现在操作结束后,s1 的值发生了变化,但是地址没有变。地址没有变,就是说我们对字符串的插入、修改、删除、替换的操作都是在修改同一块内存空间,也就是 s1 所指向的空间。


我们还可以创建一个空得可变的字符串
        //创建空得可变字符串
        NSMutableString *s2 = [NSMutableString string];
        NSLog(@"%@\t%p",s2,s2);

注意事项:
1)用@“hello world”方式创建的字符串,始终是不可变的。
        //创建空得可变字符串
        NSMutableString *s2 = [NSMutableString string];
        
        //此处有警告: Incompatible pointer types assigning to 'NSMutableString *' from 'NSString *'
        s2  = @"person";
        
        NSLog(@"%@\t%p",s2,s2); //person	0x100001130
在我们强行赋值后可以打印出来值,但是编译器或报一个警报。那么接下来修改s2的值
<span style="font-size:14px;">        [s2 appendString:@"dog"];
        NSLog(@"%@\t%p",s2,s2);</span>
此时程序运行到[s2 appendString:@"dog"]; 这句代码时报错
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to mutate immutable object with appendString:'
*** First throw call stack:
(
	0   CoreFoundation                      0x00007fff8b1a064c __exceptionPreprocess + 172
	1   libobjc.A.dylib                     0x00007fff8c88f76e objc_exception_throw + 43
	2   CoreFoundation                      0x00007fff8b1a04fd +[NSException raise:format:] + 205
	3   CoreFoundation                      0x00007fff8b15ddee mutateError + 110
	4   Mutable                             0x0000000100000dfe main + 766
	5   libdyld.dylib                       0x00007fff9561c5c9 start + 1
	6   ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
事实证明,即使我们把不可变字符串强行赋值给可变的字符串后,该字符串还是不可变,我们无法对其进行修改等操作。

2)NSMutableString的String,会覆盖掉原来所有字符串。

        NSMutableString *s3 = [NSMutableString stringWithFormat:@"ddddddddddddd"];

        NSLog(@"%@\t%p",s3,s3);
        
        //调用s3的String属性
        s3.string = @"aaaaaa";  //ddddddddddddd	0x100400000
        
        NSLog(@"%@\t%p",s3,s3); //aaaaaa	0x100400000
总结:

1)不可变字符串,它的内存空间的大小和存储的内容不能改变
2)可变字符串,它的内存空间的大小和存储的内容可以改变
3)如果把一个不可变字符串强行赋值给一个可变字符串,那么这个可变字符串就变成不可变的

PyTorch复现PSMNet踩坑全记录:从环境配置到KITTI数据集训练 本文详细记录了使用PyTorch复现CVPR经典立体匹配模型PSMNet的全过程,从环境配置到KITTI数据集训练,特别针对2023年主流软硬件环境中的常见问题提供解决方案。文章重点介绍了PSMNet的金字塔池化模块和堆叠沙漏结构,帮助研究者和工程师快速实现工业级深度估计,节省大量试错时间。 阅读详情

相关推荐

LLM大模型-vLLM本地部署全流程:Windows WSL2环境安装、HuggingFace与Modelscope模型加载与本地运行、Docker化部署与镜像分发

vLLM本地部署大模型方案 vLLM是一款高性能大模型推理引擎,通过PagedAttention技术显著提升吞吐量和内存效率,支持低成本、高并发的本地部署。 核心优势: 性能卓越:吞吐量远超同类方案,支持连续批处理等高级功能 成本优化:减少GPU服务器需求 兼容性强:提供类OpenAI的简洁API 部署步骤: 硬件准备:需NVIDIA GPU(如A100/3090),显存≥模型参数量×2(7B模型需14GB) 软件环境: Linux系统或Windows WSL2 安装CUDA 12.1+和Python 3.

2202_75674969的博客 4568

OC 中 NSString 以及和 NSMutableString 的区别

OC 中 NSString 以及和 NSMutableString 的区别 Objective-C中的 NSString 是基础中的基础,现在总结一下 NSString 的知识点,以及和 NSMutableString 的区别。 NSString 的创建方法 最常见的方法就是使用 @ 符号+字符串 NSString *word = @"simple"; 为什么要加 @ 符号呢?这里介绍一下 @ 符号,这是 OC 的语句符号,用来区分 C 语言,每当你看到 @ 符号,可以理解为:接下来执行的代码是 OC ,

BoilerUp的博客 418

coze开发-5、给智能体添加“技能”

中间编排与技能组件 中间编排的定义 中间编排是指在智能体的构建过程中,使用一些工具对智能体进行协调和管理。通过这些工具,我们能够更好地实现智能体在特定业务场景中的应用。

andyyah晓波的博客 527

incompatible pointer types assigning to 'nsmutablearray ' from 'nsarray '

这是因为NSMutableArray和NSArray不是同一个类型造成的. 解决方法 // NSArray --> NSMutableArray   NSMutableArray *myMutableArray = [myArray mutableCopy]; // NSMutableArray --> NSArray NSArray *myArray = [myMutableArr

duoduo_333的专栏 2362

02.Palantir Foundry平台功能和应用全景图

本文深入解析 Palantir Foundry 平台核心功能与应用全景。

694

HiCMAE 论文复现:基于 RAVDESS 数据集的音视频情感识别

多模态情感识别是人工智能领域的重要研究方向,旨在通过结合多种感知模态(如音频、视频、文本等)来更准确地识别人类情感状态。与传统单模态方法相比,多模态方法能够利用不同模态间的互补信息,提高情感识别的鲁棒性和准确性。 RAVDESS(Ryerson Audio-Visual Database of Emotional Speech and Song)是一个常用的多模态情感识别数据集,包含24位专业演员(12名男性,12名女性)表达的8种情感状态(中性、平静、快乐、悲伤、愤怒、恐惧、厌恶和惊讶)的音视频数据。

max500600的博客 498

NSString,NSMutableString到底用copy还是strong来修饰(ARC模式下)

详细讲解了copy和strong修饰NSString和NSMutableString的区别,以及如何使用它

wangbo6991的博客 897

行测测评——矩阵、圆形、环形三角图形数列推理解题技巧

写在前面:各大公司的测评做的让人眼花缭乱,很多题型都是第一次见,比如逻辑关系、信息推理,最难的要属找规律的数字推理了。根据B站UP主刘文超老师的课程,记录一下解题技巧。感谢UP主的无私奉献,原地址连接:https://www.bilibili.com/video/BV1it411M7o2?t=528&p=7 解题技巧: 从图形的上下、左右、交叉 角度进行尝试求解 基本法则是“加、减、乘、除、倍数、次方”六种形态。 一、有心数阵 解题技巧:周边数字通过某种运算得到中间数字 1.周边数..

涵盖了计算机专业基础知识、数学建模相关实践、复杂网络论文研究、LeetCode算法刷题经验、C语言开发经验、前端Vue、React框架开发实战相关知识 8643

NSMutableString转换成NSString的N种方法

NSString是一个不可变的字符串对象。这不是表示这个对象声明的变量的值不可变,而是表示它初始化以后,你不能改变该变量所分配的内存中的值,但你可以重新分配该变量所处的内存空间。而NSMutableString是可变的,意味着你可以追加它的内存空间,或者修改它所分配的内存空间中的值。 因为NSMutableString和NSString的差别,所以他们之间的互相转换使用使用合适的方法。 将NS...

miki西游 不积跬步,无以至千里;不积小流,无以成江海 1070

ORB-SLAM2算法部署验证、原理代码和各种改进方法汇总

本文主要汇总个人学习使用ORB-SLAM2算法中参考的相关博客和代码汇总,以及在ORB-SLAM2算法基础上各个改进方法的汇总。

重点记录机器人和自动驾驶相关领域的技术,尤其是计算机视觉,视觉SLAM等,不仅有前言文献或必备算法的学习,也会有实际应用的点滴经验 745

【升级U8+】不能将值 NULL 插入列 ‘VT_ID‘,表 ‘VoucherItems‘;列不允许有 Null 值。

不能将值 NULL 插入列 ‘VT_ID’,表 ‘UFDATA_006_2012.dbo.VoucherItems’;列不允许有 Null 值。INSERT 失败。

努力不懈的为广大客户提供优质的产品与真诚、贴心、专业的服务! 517

NSMutableString和NSString区别,及相互转换方法

NSString是一个不可变的字符串对象。这不是表示这个对象声明的变量的值不可变,而是表示它初始化以后,你不能改变该变量所分配的内存中的值,但你可以重新分配该变量所处的内存空间。而NSMutableString是可变的,意味着你可以追加它的内存空间,或者修改它所分配的内存空间中的值。 [cpp] view plaincopy "font-size: 18

LSOM的专栏 1619

【原创教程】西门子1500与施耐德伺服的通讯以及调试

该函数块主要描述伺服的手动,左边的引脚Forward是指伺服手动正转,Backward是指伺服手动反转,Fast是指手动的某个方向为快速运行,TipPos手册上描述为固定值,WaitTIme是指伺服手动的相应时间,VeloSlow指伺服手动正常慢速运动的速度,VeloFast指伺服手动快速运动的速度,Acceleration是指伺服手动的加速度,Decelertion是指伺服手动的减速度。该函数块用于伺服停止,左边的引脚Execute为伺服停止执行,Deceleration含义为减速,Axis为轴。

Qinmingyue13的博客 1375

Foundation框架—字典NSDictionary 可变和不可变

Foundation 框架初体验 _______________ NSDictionary 不可变字典 _______________ //字典和数组的区别 1.字典的内存不是连续的 数组是连续的 2.用key和value进行对应(键值)kvc键值编码 (数组是下标) 3.字典的输出为 {} 数组的输出为()//不可变的字典 要赋值 申明之后就不能改了// 对

TenMios的博客 1325

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

ios Foundation框架中的可变和不可变对象(三)

三 . NSDictionary 和 NSMutableDictionary 1.NSDictionary 2.NSMutableDictionary

u012111353的博客 337

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

ios Foundation框架中的可变和不可变对象NSArray 和NSMutableArray(二)

二   NSArray 和NSMutableArray 1 . 数组(NSArray,NSMutableArray)是⼀组有序的对象集合,通过索引下标获取到数组中的各个元素。 数组中不可以存放基本数据类型,只能存放对象。如若需要将基本数据类型放⼊数组中,需要通过NSNumber来包装成对象放入  1.1 创建NSArray

u012111353的博客 499

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

ios Foundation框架中的可变和不可变对象NSString 和NSMutableString(一)

1、NSString 和NSMutableString 1.1 字符串对象的创建: NSString *string=@"我是一个字符串"; 创建⼀个格式化字符串: int a=1; NSString *string1=[NSString stringWithFormat:@"我是格式化int类型的字符串%i",a];  1.2 比较字符

u012111353的博客 745

ios Foundation框架中的可变和不可变对象NSDictionary和NSMutableDictionary(三)

三 . NSDictionary 和 NSMutableDictionary NSDictionary和NSMutableDictionary属于字典类,它是无序的一组集合,类似于java中的Map,里面存储的是key-value键值对。 NSDictionary是不可改变的字典,也就是说一旦初始化后,里面的键值对只有查询的份了。 如果要对键值对进行“增删改”的话,那就得用NSMutable

u012111353的博客 427

Foundation框架-字符串对象的操作(不可变字符串NSString和可变字符串NSMutableString)

//                 字符串的操作                 //--------------------NSString------------------/         // NSString类 对象一旦被创建不可改变                  //创建一个字符串常量         NSString *tring =

u010297362的专栏 946

OC视频笔记(不可变字典常用方法,与优化方法)(可变字典的常用方法)

字典简介: Foundation中的字典(NSDictionary和NSMutableDictionary)是有键——值对组成的数据集合。正如我们在字典里查找单词的定义是一样的通过Key(键),查找相应的(Value)值,Key通常是字符串对象,也可以是其他任意类型的对象。在字典中,Key的值必须是唯一的。此外,字典的键和值不可以为空(nil),如果需要在一个字典中表示一个空值,可以使用NSNu

v7595v的专栏 755

学习日记— Foundation框架介绍

Foundation框架中有很多有用的、面向数据的简单类和数据类型。是由许多类,方法,函数,文档按照一定的逻辑组织起来的几何。数据类型主要如:NSString,NSArray,NSNumber等,将近有100多个类,都可以在Xcode的安装文档中找到具体的使用方法。   那么,接下来,我们就对几个主要的类型的使用进行简单的实例说明。 一、字符串(NSString类型)  

qiushuo0的博客 398

Foundation框架-NSString和NSMutableString

可变与不可变的字符串 --1-- Foundation框架介绍1.1 框架介绍--2--NSString2.1 NSString介绍及使用2.2 NSString创建方式2.3从文件中读取/存储字符串2.4 字符串的比较2.5前后缀检查及搜索2.6 字符串的截取和替换2.7 获取字符串的每个字符2.8 字符串和其他数据类型转换2.9 NSString去除空格--3--NSMut...

weixin_30830327的博客 161

Foundation框架数组

NSArray是Foundation框架的一种集合类 创建一个新的NSArray NSArray *array = [NSArray arrayWithObjects:@"foo",@"bar",@"baz",nil]; NSArray类是不可变的,创建以后就不能改变其内容。 ...

chengxunjuan4094的博客 125

OC语言学习——Foundation框架(上)

NSString代表字符序列不可变的字符串,而NSMutable代表字符序列可变的字符串。

2402_86720949的博客 1269

IOS开发第三天-Foundation框架

Foundation框架是Cocoa编程、iOS编程的基础框架,它包括字符串、集合、日期、时间等基础。 1、字符串(NSString和NSMutableString) 其中,NSStirng代表字符序列不可变的字符串,而NSMutableString则代表字符串序列可变的字符串。 测试代码如下: int main(int argc, const char * argv[]) { @

铭记_ 302

OC之Foundation字符串

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流!------ 一、Foundation框架中一些常用的类     1.字符串型: NSString:不可变字符串 NSMutableString:可变字符串     2.集合型: 1> NSArray:OC不可变数组 NSMutableArray:可变数组

VicenteZ 335
下一篇: Foundation框架之NSArray
angle0018
博客等级 码龄11年 2粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值