zoukankan      html  css  js  c++  java
  • iOS中copy的用法

    平时我们使用对象之间的传值都是采用retain count +1的方式,这种方式的适用于当对象的某属性的值改变时,引用该对象的不同指针会同时改变,因为这两个指针指向的是同一个内存地址,

    但如果需求是,当一个指针执行的对象属性值发生改变时,不影响另一个对象,那么需要分配两个不同的内存地址,也就是说,我们就不可以采用retain关键字了,而是要采用copy 关键字,因为copy关键字会在复制时重新创建一个新的对象。 举例说明一下copy使用

    这里创建一个Person类

    Person.h,代码:

    @interface Person : NSObject <NSCopying>{

    NSString *name;

    NSString  *email;

    }

    @property (nonatomic, retain) NSString *name;

    @property (nonatomic,retain)NSString *email;

    @end

    Person.m文件

    #import “Person.h”

    @synthesize name,email;

    - (id)initWithName:(NSString *)theName andEmail:(NSString *)theEmail

    {

    self = [super init];

    if (self){

    self.name = theName;

    self.email = theEmail;

    }

    }

    - (id)copyWithZone:(NSZone *)zone

    {

    Person *aPerson = [[Person allocWithZone:zone] initWithName:[self name] andEmail:[self email]];

    return aPerson;

    }

    - (void)delloc

    {

    [name release];

    [email release];

    [super dealloc];

    }

    这里说明一下,

    在对象之间copy,首先需要类是继承自NSObject,其次需要实现<NSCoding>协议,最后在方法中实现

    - (id)copyWithZone:(NSZone *)zone 方法

    如果没有此方法那么在copy对象,程序会直接宕机,并提示Person类找不到copyWithZone方法。

     

    这里还有一点需要注意的是,通常在NSArray之间copy,是retain方式的复制,也就是直接将引用系数+1,

    如下 代码:

    NSArray *array1 = [[NSArray alloc] initWithObjects:person1,person2,person3,nil];

    NSMutableArray *array2 = [array1  copy]; 或使用

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

    如果想使用两个不同内存,那么就需要使用到NSArray 的deep copy,例如:

    NSArray *array1 = [[NSArray alloc] initWithObjects:person1,person2,person3,nil];

    NSMutableArray *array2 = [[NSMutableArray alloc] initWithArray:array1 copyItems:YES];
  • 相关阅读:
    Putty·Network error:Software caused connection abort
    VSCode·搭建Java开发环境
    MSSQL·将一对多的数据合并为以指定分隔符的数据
    技能Get·Windows10将任何格式文件固定到开始屏幕
    MSSQL·查询TSQL语句执行时间的三种方法
    Javac·编码GBK的不可映射字符
    傅里叶变换、拉氏变换、z变换的含义
    宏、内联函数和普通函数的区别
    OpenGL中创建GLUT菜单
    在PC安裝Android系統+軟體
  • 原文地址:https://www.cnblogs.com/xukunhenwuliao/p/3576243.html
Copyright © 2011-2022 走看看