Objective-C:深复制(拷贝)

本文通过Objective-C中的Person类实例,详细解释了深复制的概念及其在内存管理中的应用。演示了如何通过实现NSCopying协议来完成对象的深复制,并展示了深复制前后对象的状态变化。

深复制:复制对象时,如果对象中包含对象类型的实例变量,要对对象类型的实例变量也要做对象复制。新对象中的对象类型实例变量和旧对象中的对象类型实例变量指的是不同的对象。不管任何一方实例变量对对象做修改,都互相不影响对方所指向的对象的内容。

  .h文件

复制代码
 1 //  Person.h
 2 //  03-对象复制
 3 //
 4 //  Created by ma c on 15/8/14.
 5 //  Copyright (c) 2015年. All rights reserved.
 6 //
 7 
 8 #import <Foundation/Foundation.h>
 9 
10 @interface Person : NSObject<NSCopying>
11 @property(nonatomic,copy)NSMutableString *name;//(copy)深拷贝
12 @property(nonatomic,assign)NSInteger age;
13 -(id)initWithName:(NSMutableString*)name andAge:(NSInteger)age;
14 -(void)show;
15 @end
复制代码

  .m文件

复制代码
//  Person.m
//  03-对象复制
//
//  Created by ma c on 15/8/14.
//  Copyright (c) 2015年. All rights reserved.
//

#import "Person.h"

@implementation Person
-(id)initWithName:(NSMutableString*)name andAge:(NSInteger)age
{
    self = [super init];
    if(self)
    {
        //复制对象有两种,
        //copy:复制出来的是一个不可变对象
        //mutableCopy:复制出来的是一个可变对象
        
        
        /*
        对OC内置对象来说,内置类型有可变和不可变之分,
                       自定义的类没有这个区别,都是可变的。
        */
        _name = [name mutableCopy];
        _age = age;
    }
    return self;
}
-(void)show
{
    NSLog(@"name:%@,age:%lu",_name,_age);
}
-(void)dealloc
{
    [_name release];
    [super dealloc];
}
-(id)copyWithZone:(NSZone *)zone
{
    //深复制
    //创建对象类型实例变量的副本
    //NSMutableString *name = [_name copy];
    return [[Person alloc]initWithName:_name andAge:_age];
}
@end
复制代码

  .m主函数

复制代码
 1 //  main.m
 2 //  03-对象复制
 3 //
 4 //  Created by ma c on 15/8/14.
 5 //  Copyright (c) 2015年. All rights reserved.
 6 //
 7 
 8 #import <Foundation/Foundation.h>
 9 #import "Person.h"
10 int main(int argc, const char * argv[]) {
11     @autoreleasepool {
12         // 测试Person类
13         NSMutableString *name = [NSMutableString stringWithString:@"Tom"];
14         
15         Person *p1 = [[Person alloc]initWithName:name andAge:20];
16         [p1 show];
17         
18         [name appendString:@"Jerry"];
19         
20         Person *p2 = [[Person alloc]initWithName:name andAge:21];
21         [p2 show];
22         
23         [p1 show];
24         
25         //对象复制,自定义对象必须要实现NSCopying协议才能支持对象复制
26         Person *p3 = [p1 copy];
27         [p3 show];
28         
29         [p1.name appendString:@"123"];//因为copy,p1和p2指向不同对象,互不影响
30         [p3 show];
31         
32         NSMutableString *name2 = [NSMutableString stringWithString:@"Jobs"];
33         [p1 setName:name2];//p1和p3指向的是不同的对象,互不影响
34         [p3 show];
35         
36         [p1 release];
37         [p2 release];
38         [p3 release];
39     }
40     return 0;
41 }
复制代码

  测试结果如下:

复制代码
2015-08-14 16:54:53.912 03-对象复制[1512:99948] name:Tom,age:20
2015-08-14 16:54:53.913 03-对象复制[1512:99948] name:TomJerry,age:21
2015-08-14 16:54:53.913 03-对象复制[1512:99948] name:Tom,age:20
2015-08-14 16:54:53.913 03-对象复制[1512:99948] name:Tom,age:20
2015-08-14 16:54:53.914 03-对象复制[1512:99948] name:Tom,age:20
2015-08-14 16:54:53.914 03-对象复制[1512:99948] name:Tom,age:20
Program ended with exit code: 0
复制代码

 

程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式!


本文转自当天真遇到现实博客园博客,原文链接:http://www.cnblogs.com/XYQ-208910/p/4730533.html,如需转载请自行联系原作者
【多变量输入超前多步预测】基于CNN-BiLSTM的光伏功率预测研究(Matlab代码实现)内容概要:本文介绍了基于CNN-BiLSTM模型的多变量输入超前多步光伏功率预测方法,并提供了Matlab代码实现。该研究结合卷积神经网络(CNN)强大的特征提取能力与双向长短期记忆网络(BiLSTM)对时间序列前后依赖关系的捕捉能力,构建了一个高效的深度学习预测模型。模型输入包含多个影响光伏发电的气象与环境变量,能够实现对未来多个时间步长的光伏功率进行精确预测,适用于复杂多变的实际应用场景。文中详细阐述了数据预处理、模型结构设计、训练流程及实验验证过程,展示了该方法相较于传统模型在预测精度和稳定性方面的优势。; 适合人群:具备一定机器学习和深度学习基础,熟悉Matlab编程,从事新能源预测、电力系统分析或相关领域研究的研发人员与高校研究生。; 使用场景及目标:①应用于光伏电站功率预测系统,提升电网调度的准确性与稳定性;②为可再生能源并网管理、能量存储规划及电力市场交易提供可靠的数据支持;③作为深度学习在时间序列多步预测中的典型案例,用于科研复现与教学参考。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,重点关注数据归一化、CNN特征提取层设计、BiLSTM时序建模及多步预测策略的实现细节,同时可尝试引入更多外部变量或优化网络结构以进一步提升预测性能。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值