Objective-C之语法copy、mutablecopy以及自定义复制功能

不用Root也能抓包?Android高版本HTTPS抓包的3种替代方案(含Charles技巧) 本文针对Android高版本HTTPS抓包难题,提供了三种无需Root权限的实战解决方案:利用VirtualXposed等虚拟沙盒环境、配置Postern等系统级代理工具,以及通过修改应用源码或网络安全配置。文章还详细解析了Charles抓包工具在非Root环境下的高级配置与排错技巧,帮助开发者在遵守安全规范的前提下,有效进行网络调试与监控。 阅读详情

copy设计的目的:改变副本的时候,不会影响到原来的对象
1、一个对象使用copy或者mutableCopy方法可以创建对象的副本
2、copy需要先实现NSCopying协议,创建的是不可改变副本(NSString、NSArray、NSDictionary)
mutableCopy 需要先创建NSMutableCopying协议,创建的是可变副本(如NSMutableString、NSMutableArray、NSMutableDictionary)
3、深复制:内容拷贝,源对象和副本指向的是同一个对象。源对象引用计数器不变,副本计数器设置为1
浅复制:指针复制,源对象和副本对象指向的二十同一个对象,对象的引用对象加1,其实相当于做了一次retain操作
只有不可变对象创建不可变副本(copy)才是浅复制,其它都是深复制

4、NSString、NSArray、NSDictionary三种OC对象默认都已经实现了cooppying和NSMutableCopying协议

5、自定义类添加复制功能:
如果想自定义copy,那么必须遵守NSCopying,并实现copyWithZone:方法
如果想自定义mutableCopy,那么就必须遵守NSMutableCopying,并实现mutableCopyZone:方法
例如copy:
建议用self class 代替类名

- (id)copyWithZone:(NSZone *)zone{
    id copy = [[[self class] allocWithZone:zone] init];
    //这儿开始做一些属性的初始化
    return copy;
}

测试demo代码如下:
在这个demo中主要演示copy、mutableCopy,解说深拷贝、浅拷贝
以及自定义copy、mutableCopy的方法

Student.h文件
#import <Foundation/Foundation.h>
@interface Student : NSObject<NSCopying>
//copy代表set方法会release旧对象,copy新对象
//修改外面的变量,并不会影响到内部的成员变量
//建议:NSString一般用copy策略,其它对象一般用retain
//retain 和外边是同一个对象,外边该了,里面这个name属性也会改
@property (nonatomic, retain) NSString *name;

+ (id)studentWithName:(NSString *)name;

@end

Student.m文件:
#import "Student.h"
@implementation Student
/**
//@property (copy) :的意思如同下面这段setName方法
- (void)setName:(NSString *)name{
    if(_name!=name){
        [_name release];
        _name = [name copy];
    }
}
**/

+ (id)studentWithName:(NSString *)name{
    //最好写slef class
    Student *stu = [[[[self class] alloc] init] autorelease];
    stu.name = name;
    return stu;
}

#pragma mark coping协议的方法
//这里创建的副本对象不要求释放
- (id)copyWithZone:(NSZone *)zone{
    Student *copy = [[[self class] allocWithZone:zone]init];
    copy.name = self.name;
    return copy;
}
//description 内部不能打印self不然会有死循环
- (NSString *)description{
    return [NSString stringWithFormat:@"name=%@",_name];
}

- (void) dealloc{
    NSLog(@"student %@ is destoryed", self);
    [_name release];
    [super dealloc];
}

@end

GoodStudent.h文件:
#import "Student.h"
@interface GoodStudent : Student

@property (nonatomic, assign) int age;

+ (id) goodStudentWithAge:(int) age name:(NSString *)name;

@end

GoodStudent.m文件:

#import "GoodStudent.h"
@implementation GoodStudent
+ (id)goodStudentWithAge:(int)age name:(NSString *)name{
    GoodStudent *good = [GoodStudent studentWithName:name];
    good.age = age;
    return good ;
}

#pragma mark 重写父类的方法
- (id)copyWithZone:(NSZone *)zone{
    //一定要调用父类的这个方法,因为父类帮我们copy了名字
    GoodStudent *copy = [super copyWithZone:zone];
    copy.age = self.age;
    return copy;
}

- (NSString *)description{
    return [NSString stringWithFormat:@"[name=%@, age=%i]",self.name, _age];
}
@end

main测试方法:

#import <Foundation/Foundation.h>
#import "Student.h"
#import "GoodStudent.h"

void stringMutableCopy(){
    NSString *string = [[NSString alloc] initWithFormat:@"age is %i",10];
    //产生一个新的对象,计数器为1,源对象的计数器不改变
    NSMutableString *str = [string  mutableCopy];
   
    NSLog(@"string: %zi",[string retainCount]); //1
    NSLog(@"str :%zi",[str retainCount]);  //1
    //str和string不是相同对象
    NSLog(@"%i",str ==string);//0
   
    [str release];
    [string release];
   
}
/**
 只有这一种情况是浅拷贝:指针拷贝,不会产生新的对象
 **/
void stringCopy(){
    NSString *string = [[NSString alloc] initWithFormat:@"age is %i",10];
    //copy是不可变副本,由于源对象本身就不可变,所以为了性能着想,copy直接返回源对象本身
   // 源对象计数器+1
    NSString *str = [string copy];

    NSLog(@"%zi",[string retainCount]); //2
    NSLog(@"%zi",[str retainCount]); //2
    //相同对象
    NSLog(@"%i",str == string);  //1
   
    [str release];
    [string release];
}
/**
 只有一种情况浅拷贝:string-string
 **/
//深拷贝
void mutableStringCopy(){
    NSMutableString *string = [NSMutableString stringWithFormat:@"age is %i",10];
    NSString *str = [string copy];
   
    NSLog(@"%i",str == string); //0
}
//深拷贝
void mutableStringMutableCopy(){
    NSMutableString *string = [NSMutableString stringWithFormat:@"age is %i",10];
    NSMutableString *str = [string mutableCopy];
    NSLog(@"%i",str == string ); //0
   
    [str appendString:@"abc"];
    NSLog(@"%@", str); //10abc
   
}
//stendent属性的copy
void studentNameCopy(){
    Student *stu = [[[Student alloc]init] autorelease];
    NSMutableString *string = [NSMutableString stringWithFormat:@"age is %i", 10];
   
    stu.name = string;
   
    [string appendString:@"abcd"];
   
    NSLog(@"stu.name=%@",stu.name);
    NSLog(@"string=%@",string);
}
//stendent对象的copy
void studentCopy(){
    Student *stu1 = [Student studentWithName:@"stu1"];
    Student *stu2 = [stu1 copy];
   
    NSLog(@"stu1:%@",stu1.name);
    NSLog(@"stu2:%@",stu2.name);
   
    stu2.name = @"stu2";
   
    NSLog(@"stu1:%@",stu1.name);
    NSLog(@"stu2:%@",stu2.name);
    NSLog(@"%i",stu1 == stu2);
   
    [stu2 release];
}
//GoodStudent子类的copy
void goodStudent(){
    GoodStudent *goodStu1= [GoodStudent goodStudentWithAge:20 name:@"goodStu1"];
    NSLog(@"goodStu1:%@",goodStu1);
   
    GoodStudent *goodStu2 = [goodStu1 copy];
    NSLog(@"goodStu2:%@",goodStu2);
}
int main(int argc, const char * argv[])
{

    @autoreleasepool {
        NSLog(@"----stringMutableCopy----");
        stringMutableCopy();
        NSLog(@"----stringcopy----");
        stringCopy();
        NSLog(@"----mutableStringCopy----");
        mutableStringCopy();
        NSLog(@"----mutableStringMutableCopy----");
        mutableStringMutableCopy();
        NSLog(@"----studentNameCopy----");
        studentNameCopy();
        NSLog(@"----studentCopy----");
        studentCopy();
        NSLog(@"----goodStudent----");
        goodStudent();
    }
    return 0;
}

你学Simulink--基于储能系统的建模与仿真场景:飞轮储能系统在电网调频中的作用仿真 本文详细介绍了利用Simulink+Simscape搭建飞轮储能系统(FESS)电网调频仿真模型的全过程。主要内容包括:系统工作原理及调频作用分析,基于Simulink的模块化建模步骤(飞轮、电机/发电机、功率电子接口等组件搭建),调频控制策略实现(频率检测、功率指令生成和模式切换),以及仿真参数设置与结果分析方法。该模型可有效模拟FESS在电网频率调节中的快速响应特性,为新能源存储和智能电网研究提供重要仿真工具,同时可通过参数优化和算法改进进一步提升系统性能。 阅读详情

相关推荐

别再傻傻分不清了!一文搞懂电机里的‘旋变’和‘编码器’到底有啥区别

本文深度解析电机位置传感器中旋转变压器(旋变)与编码器的核心区别,包括工作原理、精度对比及环境适应性。通过实测数据和典型应用场景,帮助工程师在工业机器人、新能源汽车电机等关键领域做出精准选型决策,提升系统可靠性和控制精度。

weixin_28689507的博客 502

copy与mutableCopy

记住: 1.对于容器类本身,与非容器类对象的结论相同,即 如果对一不可变对象复制,copy是指针复制(浅拷贝)和mutableCopy就是对象复制(深拷贝)。 如果是对可变对象复制,都是深拷贝,但是copy返回的对象是不可变的。 关键要注意的是复制后容器内对象的变化,比如添加、删除元素,修改某个元素的值。 2.对于容器而言,其元素对象始终是指针复制。如果需要元素对象也

bravegogo的专栏 781

Allegro模块复用:从原理图到PCB的完整流程与关键细节

本文详细介绍了Allegro模块复用从原理图到PCB的完整流程与关键细节,包括DSN和MDD文件的创建、模块调用的实战技巧以及双向同步与版本控制方法。通过标准化处理和高级复用技巧,能显著提升PCB设计效率,减少重复工作时间。适用于智能硬件和工业控制等领域的工程师。

weixin_30252709的博客 332

【iOS】对象复制与属性关键字

end@end@end// 深拷贝// 深拷贝return 0;我们可以看到无论是copy还是mutableCopy,都是深拷贝,这是因为我们本来就是使用copyWithZone和mutableCopyWithZone进行拷贝的。使用宏和常量所占用的内存差别不大,宏定义的是常量,常量都放在常量区,只会生成一份内存 缺点:编译时刻:宏是预编译(编译之前处理),const是编译阶段。导致使用宏定义过多的话,随着工程越来越大,编译速度会越来越慢。

2402_86720949的博客 1291

Windows下RISC-V开发环境搭建:xpack-riscv-none-elf-gcc安装配置全攻略

本文详细介绍了在Windows平台下搭建RISC-V开发环境的完整流程,重点讲解xpack-riscv-none-elf-gcc工具链的安装配置方法。从环境变量设置到VSCode集成开发环境搭建,涵盖汇编程序和C程序开发实践,为开发者提供一站式解决方案,助力快速掌握RISC-V架构开发技能。

weixin_26765287的博客 437

手把手教你用S7-PLCSIM Advanced V3.0搭建PLC仿真测试环境(含WinPcap避坑指南)

本文详细介绍了如何使用西门子S7-PLCSIM Advanced V3.0搭建PLC仿真测试环境,包括WinPcap 4.1.3驱动的安装避坑指南。从环境准备、软件安装到配置调试,提供了一套完整的解决方案,帮助工程师和教学人员快速构建可靠的PLC仿真环境,解决常见的报错问题。

weixin_30879169的博客 641

Objective-C的对象复制与拷贝选项

​copy和都是NSObejectcopycopy方法用于创建一个不可变的副本,无论原始对象是可变的还是不可变的。对于不可变对象,copy方法仅仅是增加了引用计数,返回的仍然是原始对象本身。对于可变对象,copy方法会创建一个新的不可变对象,内容与原始对象相同。方法用于创建一个可变的副本,无论原始对象是可变的还是不可变的。对于不可变对象,方法会创建一个新的可变对象,内容与原始对象相同。对于可变对象,方法会创建一个新的可变对象,内容与原始对象相同。copy返回的是不可变副本,而。

aa2002aa的博客 1768

SAR成像专栏目录

为方便大家阅读,我做了一个专栏目录,蓝色字有超链接,可以直接打开。 本专栏默认读者已具备雷达系统的基本知识或者已阅读过雷达导论专栏中的文章。 1. 概述 SAR成像概述 星载SAR的各项指标解读(史上最全) SAR成像算法的实现途径与算力分析 2. SAR成像原理与SAR系统简介 雷达与分辨率 SAR成像原理与方法 SAR图像的形成和处理 SAR系统设计 3. 点目标仿真 点目标仿真(一)—— 数学模型 点目标仿真(二)—— Matlab仿真 4. 成像算法 更新中 雷达导论专

7464

iOS关于Copy和mutableCopy方法的浅析

以数组为例,来记录一下Copy 和 mutableCopy的使用细节。 我们知道可变数组和不可变数组之间的转化可以通过下面的方式: [NSMutableArray copy] --> NSArray [NSArray mutableCopy] --> NSMutableArray 我们也知道: (图片来自网络) 那么当我们调用数组的mutableCopy方法时,是否将数组中所包含的对应也深拷贝了呢? testClass* class0 = [testClass new]; cl.

CoderL 2319

YOLOv11模型改进:利用注意力机制实现小目标检测精度跃升

如果你在实操中遇到精度提升不明显或速度下降过多的问题,不妨尝试调整注意力模块的类型(如替换为CA)或插入层级,或针对性优化小目标的数据集增强策略。记住,小目标检测的核心是“特征强化与空间定位”,只要结合业务场景灵活调整注意力模块的组合,你也能让YOLOv11在小目标识别任务中脱颖而出。接下来,我们从模块选型到代码落地,一步步带你打造“小目标检测专精版”YOLOv11,真正帮你解决工业场景中(如安防、质检)的小目标识别痛点。在城市安防场景中,改进后的YOLOv11对远处行人、车辆(小目标)的识别准确率提升。

m0_71589036的博客 454

C#上位机+YOLOv8实战:摄像头/视频流实时目标检测(工业级优化+完整可运行源码)

纯C#实现,无Python依赖,适配工业工控机部署;工业级优化:解决帧率、内存、鲁棒性三大核心问题;代码完整可复用,支持摄像头/视频流/RTSP多源检测;避坑指南覆盖开发中90%的常见问题,降低落地成本。相较于传统方案,该方案兼顾实时性与易用性,成本仅为商用视觉库的1/10,可快速落地到工业质检、安防、物流等场景。后续可拓展方向包括:自定义数据集训练、GPU加速推理、工业通信(PLC/串口)对接等。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 733

iOS中的copy与mutableCopy

Copy & MutableCopy 使用copy或mutableCopy方法可以创建一个对象的副本 copy 需要实现NSCoppying协议 这些创建的是不可变副本(如NSString、NSArray、NSDictionary) mutableCopy 需要先实现NSMutableCopying协议 创建的是可变副本(如NSMutableString、NSMutableArray、NS...

半山的博客 1210

从零搭建实时数仓:基于Flink+ClickHouse的实践

实时数据处理和实时数据查询。市场上的技术方案众多,为何选择Flink+ClickHouse?

AIGC应用创新大全的博客 1320

探索Objective-C中的对象复制:深入理解copy和mutableCopy

iOS的copy以及深拷贝浅拷贝

u013712343的博客 1190

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

全面了解Objective-C:Copy

copy 老生常谈了。估计是个iOS开发者都知道这事。这篇文章就稍微全面写一写。 原文章 传送门1、系统对象的copy与mutableCopyNSObject类提供了copy和mutableCopy方法,通过这两个方法即可复制已有对象的副本,本文将会详细介绍关于对象复制的内容。copy方法用于复制对象的副本。通常来说,copy方法总是返回对象的不可修改的副本,即使对象本身是可修改的。例如,程序调用N

水清_木秀的博客 706

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Objective-c中对象的Copy、MutableCopy、浅拷贝、深拷贝

对象的复制就是复制一个对象作为副本,他会开辟一块新的内存(堆内存)来存储副本对象,就像复制文件一样,即源对象和副本对象是两块不同的内存区域。对象要具备复制功能,必须实现协议或者协议,常用的可复制对象有:NSNumber、NSString、NSMutableString、NSArray、NSMutableArray、NSDictionary、NSMutableDictionary copy:产生对

出头天 9938

iOS中copy和mutableCopy的详细分析

copy和mutableCopy在实际开发中常用到,同时,copy属性修饰符也是我们在定义NSString、NSArray和block等需要用到的,要较好地掌握它们,需要从原理上去分析于理解,本文侧重于分析copy和mutableCopy是如何实现的,进一步讲解使用copy和mutableCopy时应该注意的细节问题 本文分成两个部分来讲解说明,第一个是copy和mutableCopy方法的使用

nineteen_的博客 3746

Objective-C中Copy和MutableCopy,你了解多少?

在iOS开发中,对于copy和mutableCopy都不陌生。如果您不知道它们之间区别的话,看完本文我相信您肯定会分的很清楚。接下来,就通过几个小例子来了解一下吧。 NO.1 NSArray * array = [[NSArray alloc] initWithObjects:@"sogouqa", nil]; NSArray * retainArray = array;

4iO3&DagWatu 1030

深入理解 retain,copy,mutableCopy

一,retain和copy的区别: 众所周知,成员属性,retain修饰,引用计数加1,copy修饰,重新开辟内存复制对象。在官方SDK中,NSString属性都是copy,而不是retain。这么做的原因就是,如果赋值的是一个NSMutableString 类型的变量,那么当你在外部修改值时,你的属性值也跟着改变了。 例1: @property(nonatomic,retain)NSStr

一个程序猿的故事 1861

copy和mutableCopy的使用

一个对象使用copy或mutableCopy方法可以创建对象的副本 copy - 需要先实现NSCopying协议,创建的是不可变副本(如NSString, NSArray, NSDictionary) mutableCopy - 需要先实现NSMutableCopying协议,创建的是可变副本(如NSMutableString,NSMutableArray, NSMutableDiction...

weixin_33672109的博客 364

OC关键字copy与mutableCopy

OC关键字Copy与MutableCopy原理,如何在自定义类中使用与重写。

FlackLee的博客 544

Copy、MutableCopy方法、copy关键字

Copy、MutableCopy方法、copy关键字 Copy MutableCopy方法 1、对immutable对象进行copy操作,是浅复制,mutableCopy操作时深复制。 2、对mutable对象进行copy和mutableCopy都是深复制。 3、copy返回的都是不可变对象, mutableCopy返回的都是可变对象 NSString NSString *...

lpzsrong的专栏 451

Objective-C——浅复制和深复制

文章目录关于copycopy基本概念如何使用copy功能使用copy功能的前提使用mutableCopy功能的前提深/浅复制概念浅复制深复制 关于copy copy基本概念 什么是copy copy的字面意思是“复制”、“拷贝”,是一个产生副本的过程 常见的复制有:文件复制 作用: 利用一个源文件产生一个副本文件 特点: 修改原文件的内容 修改副本文件的内容,不会影响源文件 OC中的copy 作用: 利用一个源对象产生一个副本对象 特点: 修改源对象的属性和行为,不会影响副本对象 修

kochunk1t的博客 496

copy和mutableCopy都是浅拷贝!!!

嗯,标题就是要这么醒目,不然没人看。虽然要追求醒目,但绝不是信口开河。所有系统容器类的copy或mutableCopy方法,都是浅拷贝!!! 是的,你没有听错。 所有系统容器类的copy或mutableCopy方法,都是浅拷贝!!! 所有系统容器类的copy或mutableCopy方法,都是浅拷贝!!! 所有系统容器类的copy或mutableCopy方法,都是浅拷贝!!!

iCodeWoods 5349

Objective-C Copy相关

在日常开发中,会经常用到copy,Objective-C中很多对象都支持copy操作,如NSString,NSArray,NSDictionary,开发者自定义的对象也是可以支持copy操作的。和copy放在一起比较的还有mutableCopy、strong,那么三者之间到底有什么区别呢?什么情况下用copy,什么情况下用strong呢?下面围绕这几个问题来研究一下。copy 和 mutableCo

TuGeLe的博客 422

关于copy 和 mutableCopy的一点思考

好久没有写博客了,今天得空写一写 前几天,小伙伴微信发过来一段代码,想要对model进行深拷贝,代码如下: (Person类中没有任何代码) Person *person1 = [[Person alloc] init]; Person *person2 = [person1 mutableCopy]; 但是这样会崩溃的,具体原因主要与深拷贝只是相关

ZZLing_Zhou的博客 632

OC语法——Object-C retain、copy、mutableCopy的详细分析

OC语法中的retain、copy、mutableCopy 大家都基本知道它的基本意思,但是对于mutable类型和immutable类型的处理上有很多童鞋并没有真正测试过,今天就和大家分享下: 1.先来看下NSString下retain、copy和mutableCopy的测试 NSString *string = @"abc"; NSString *retainSt

梁山伯与伏地魔的博客 949
上一篇: Objective-C之Foundation框架的NSObject和反射机制的应用
下一篇: IOS之第一个IOS程序
技术宝哥
博客等级 码龄16年 331粉丝 222原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值