IOS学习——复制

[size=x-large][b]1.浅复制[/b][/size]
浅复制只复制对象本身,对象里的属性、包含的对象不做复制 深复制复制全部,包括对象的属性和其他对象Foundation框架支持复制的类,默认是浅复制

NSMutableArray *array=[[NSMutableArray alloc] init];
NSLog(@"数组的地址为 %p",array);
for(int i=0;i<3;i++)
{
NSObject *obj=[[NSObject alloc] init];
[array addObject:obj];
}
for(NSObject *obj1 in array)
{
NSLog(@"地址为 %p",obj1);
}
NSMutableArray *array2=[array copy];
for(NSObject *obj2 in array2)
{
NSLog(@"地址为 %p",obj2);
}
NSLog(@"数组的地址为 %p",array2);
NSString * str1 = [[NSMutableString alloc]init];
NSLog(@"字符串的地址是 %p",str1);
NSString * str2 = [str1 copy];
NSLog(@"字符串深复制的地址是 %p",str2);
NSString * str3 = str1;
NSLog(@"字符串浅复制的地址是 %p",str3)


从打印结果可以看出
a、对于数组,浅复制的话只复制了数组的地址,而数组里面的元素仍未复制,如果想要复制里面的元素,则需要实现深复制;
b、对于字符串,浅复制的话只是增加了对字符串地址的引用,计数器+1,深复制对字符串进行了重新开辟了空间,地址变化


NSArray *array=[NSArray arrayWithObjects:@"one",@"two", nil];
NSMutableArray *array1=[array copy];
//array1的地址跟array地址一样,相当于浅复制
[array1 addObject:@"three"];
//这里执行错误
NSMutableArray *array2=[array mutableCopy];
// array2的地址跟array地址不一样
[array2 addObject:@"three"];
//执行正确
NSMutableArray * array3 =[[NSMutableArray alloc] init];
NSLog(@"地址为 %p",array3);
NSMutableArray * array4 = [array3 copy];
NSLog(@"地址为 %p",array4);


a、copy返回一个不可变对象的副本,MutalbeCopy返回一个可变对象的副本
b、array1地址与array地址一样,是因为Foundation对于copy不可变(NSArray,NSString之类)对象而言,默认都是浅拷贝,相当于retain,当然此时用mutableCopy相当于copy功能
同样,对于可变对象进行copy操作时,相当于copy而非retain,此时copy的对象不可变,如果需要可变则mutableCopy
c、array2地址与array地址不一样,相当于实现了数组的复制功能,当然如果需要对里面的元素进行复制,需要实现深度复制


[size=x-large][b]2.深复制[/b][/size]
对象拥有深复制特性,必须实现NSCopying,NSMutableCopying协议,实现该协议的copyWithZone方法和mutableCopyWithZone方法深拷贝和浅拷贝的区别就在于copyWithZone方法的实现

@interface Person : NSObject<NSMutableCopying>
@property(nonatomic,copy)NSString *name;
@property(nonatomic,copy)NSString *age;
@end

@implementation Person
- (id)mutableCopyWithZone:(NSZone *)zone
{
Person *person=[[self class] allocWithZone:zone];
person.age=[_age mutableCopy];
person.name=[_age mutableCopy];
return person;
}
@end
Person *person=[[Person alloc] init];
person.name=@"andy";
person.age=@"20";
Person *person2=[person copy];
NSLog(@"地址为 %p",person);
NSLog(@"地址为 %p",person2);
NSLog(@"地址为 %p",person.name);
NSLog(@"地址为 %p",person2.name);


NSMutableArray * array2 =  [[NSMutableArray alloc] initWithArray:array1 copyItems:YES];

打印出来结果是不仅仅复制了person地址,person中的对象地址也进行了复制
实现数组的深度复制,复制的不仅仅是数组本身,数组中的元素也被复制
资源下载链接为: https://pan.quark.cn/s/790f7ffa6527 在一维运动场景中,小车从初始位置 x=-100 出发,目标是到达 x=0 的位置,位置坐标 x 作为受控对象,通过增量式 PID 控制算法调节小车的运动状态。 系统采用的位置迭代公式为 x (k)=x (k-1)+v (k-1) dt,其中 dt 为仿真过程中的恒定时间间隔,因此速度 v 成为主要的调节量。通过调节速度参数,实现对小车位置的精确控制,最终生成位置 - 时间曲线的仿真结果。 在参数调节实验中,比例调节系数 Kp 的影响十分显著。从仿真曲线可以清晰观察到,当增大 Kp 值时,系统的响应速度明显加快,小车能够更快地收敛到目标位置,缩短了稳定时间。这表明比例调节在加快系统响应方面发挥着关键作用,适当增大比例系数可有效提升系统的动态性能。 积分调节系数 Ki 的调节则呈现出不同的特性。实验数据显示,当增大 Ki 值时,系统运动过程中的波动幅度明显增大,位置曲线出现更剧烈的震荡。但与此同时,小车位置的变化速率也有所提高,在动态调整过程中能够更快地接近目标值。这说明积分调节虽然会增加系统的波动性,但对加快位置变化过程具有积极作用。 通过一系列参数调试实验,清晰展现了比例系数和积分系数在增量式 PID 控制系统中的不同影响规律,为优化控制效果提供了直观的参考依据。合理匹配 Kp 和 Ki 参数,能够在保证系统稳定性的同时,兼顾响应速度和调节精度,实现小车位置的高效控制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值