OC-对象

OC-对象

OC中创建对象

  • 创建OC对象需要两个步骤: 分配和初始化
  • 最后会返回指向完成对象的指针
    OC中创建对象有两种方法:

    1. [[Person alloc] init] //在创建对象时,这两部一般合成在一块, 以防止alloc分配不成功,而初识化类野指针
    2. [Person new] //就是合并了上面的两步, 当时在初始化时并不能传递参数
  • allloc 与 allocWithZone

  • alloc默认是在堆上分配内存,而allocWithZone 则可以从指定区域分配内存
  • alloc被实现为 allocWithZone:nill
  • 限制Apple不推荐使用allocWithZone


  • 构造方法 init

  • 一个类一般都有多个构造方法,都是以init开头
  • 典型写法
-(id) init   //id 可以被理解为时 (void*)类型
    {
        if(self = [super init])   //保证父类初识化
        {
            /*对本类做初始化工作*/
        }

        return self;
    }
  • 带有多个参数的初始化器
    -(id) initWithShirtSize:(NSUInteger) inShirtSize color:(NSColor*) inShirtColor
    {
        if( self = [super init] )
        {
            shirtSize = inShirtSize;
            shirtColor = [inShirtColor retain];  //必须要保留这个对象的
        }

        return self;
    }
  • 指定的初始化器(就是为了保证类的完全初始化,的口头约定)

    • 首先,在OC语法中并没有指定初始化器的正式概念。
    • 指定初始化器是将完全初始化类的实例的初始化器(不调用它就初识化不成功对象)
      • 所有其他的本类初始化器最终必须调用本类的指定初始化器
      • 本类的指定初识化器必须调用其超类的指定初识化器
  • 失败的初识化

    • 如果在初始化对象的过程中失败了, 我们应该这么做
      • 执行没有被dealloc处理的任何清理工作
      • 释放self,(这是由于self是由alloc利用保留计数1创建的, 必须利用release抵消alloc)
      • 返回nill
    • 下面来看一下,拥有两个数组实例变量的类是如何初识化的
-(id) init
    {
        if( self = [super init] )
        {
            anArray1 = [[NSMutableArray] init];

            if( anArray1 == nill )
            {
                [self release];
                return nil;
            }

            anArray2 = [[NSArray alloc] initWithContentOfFile: @"/Users/rclair/stuff"];

            if( anArray2 == nil )
            {
                [self release];
                return nil;
            }
        }

        return self;
    }

在执行[self release]之后, self中保存的对象将不再有效, 因此在对self调用release与返回nil之间,不应该执行
任何引用self的代码。

对象的销毁

  • 在OC中, 不会显示销毁对象
  • 当对象使用完毕后, 可以给他发送一条release消息, 如果对象的保留计数变为0, 那么对象的dealloc方法会被自动调用
  • dealloc类似C++中的析构函数
  • 在dealloc中我们应
    • 给正在消失的对象创建或保留的任何对象发送一条release消息
    • 调用超类的dealloc方法 (很重要, 并且应该出现在最后一行)

复制对象 ##

  • NSObject提供类一个copy方法, 但是这个copy方法并没做任何实现
  • 允许复制的类,采用NSCopying协议
  • 这意味着, 想要自己的类可以被复制,应实现 copyWithZone: 方法。
  • 浅复制和深复制

    • 浅复制: 把原始的指针对象简单的提供给新的对象
    • 深复制: 依次复制任何子对象,并把子对象的副本也提供给新对象
      • 可以看出, 浅复制将副本和原始对象纠缠在一起
      • 深复制将会产生两个完全独立的对象
  • 可变复制与不可变复制

    • NSArray, NSDictory, NSset这些对象都是不可变的实例。
    • 不过,可以通过这些实例,来复制出可变实例
    NSMutabkeArray* aMutableCopyOfAnArray = [anArray mutableCopy];
  • 对于不可变的类,复制很简单
  • 由于独享是不能被修改的, 因此原始对象与副本之间永远不会有任何区别, 因此copyWithZone可以这样实现
    -(id) copyWithZone:(NSZone*)zone
    {
        return [self retain];
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值