zoukankan      html  css  js  c++  java
  • iOS copy/retain/assign

    1 深复制:内容拷贝,源对象和副本对象指的是两个不同的对象,源对象引用计数器不变,副本对象引用计数器为1

    2 浅复制:指针拷贝,源对象和副本对象指的都是同一个对象,对象引用计数器+1,相当于retain

    3 只有不可变对象创建不可变副本(copy)才是浅复制,其它的都是深复制

    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];

  • 相关阅读:
    Wireshark教程
    存储基础知识4——
    java核心技术 要点笔记3
    java核心技术 要点笔记2
    java核心技术 要点笔记1
    java Vamei快速教程22 内存管理和垃圾回收
    java Vamei快速教程21 事件响应
    php框架练习
    php之图片处理类缩略图加水印
    php之框架增加日志记录功能类
  • 原文地址:https://www.cnblogs.com/apem/p/4310329.html
Copyright © 2011-2022 走看看