• Objective-C:MRC(引用计数器)获得对象所有权的方式(init、retain、copy等)


         .h声明文件

     1 //  Integer.h
     2 //  02-MRC
     3 //
     4 //  Created by ma c on 15/8/13.
     5 //  Copyright (c) 2015年. All rights reserved.
     6 //
     7 
     8 #import <Foundation/Foundation.h>
     9 
    10 @interface Integer : NSObject
    11 @property(nonatomic,assign)NSInteger i;
    12 -(id)initWithI:(NSInteger) i;
    13 -(void) print;
    14 +(Integer *)integerWithIntger:(NSInteger) i;
    15 @end

      .m实现文件

     1 //  Integer.m
     2 //  02-MRC
     3 //
     4 //  Created by ma c on 15/8/13.
     5 //  Copyright (c) 2015年. All rights reserved.
     6 //
     7 
     8 #import "Integer.h"
     9 
    10 @implementation Integer
    11 -(id)initWithI:(NSInteger) i
    12 {
    13     self = [super init];
    14     if(self)
    15     {
    16         _i = i;
    17     }
    18     return self;
    19 }
    20 +(Integer *)integerWithIntger:(NSInteger) i
    21 {
    22     return [[Integer alloc]initWithI:i];
    23 }
    24 
    25 -(void) print
    26 {
    27     NSLog(@"i = %ld",_i);
    28 }
    29 -(void)dealloc
    30 {
    31     NSLog(@"integer dealloc");
    32     [super dealloc];
    33 }
    34 @end

     

       主函数测试

     1 //  main.m
     2 //  02-MRC
     3 //
     4 //  Created by ma c on 15/8/13.
     5 //  Copyright (c) 2015年. All rights reserved.
     6 //
     7 
     8 #import <Foundation/Foundation.h>
     9 #import "Integer.h"
    10 int main(int argc, const char * argv[])
    11 {
    12     @autoreleasepool
    13     {
    14         //测试手动引用计数
    15         //1.创建对象会获得对象所有权
    16         Integer *i1 = [[Integer alloc]initWithI:10];
    17         NSLog(@"retaincount = %lu",[i1 retainCount]);//1
    18         
    19         
    20         //2.只通过指针赋值,不会获得对象所有权
    21         Integer *i2 = i1;
    22         NSLog(@"retaincount = %lu",[i2 retainCount]);//1
    23         
    24         
    25         //3.通过retain会获得对象的所有权
    26         [i1 retain];
    27         NSLog(@"retaincount = %lu",[i1 retainCount]);//2
    28         
    29         
    30         //4.将对象添加到容器中,容器中会存储对象的一个引用,会获得对象所有权
    31         NSMutableArray *array = [NSMutableArray array];
    32         [array addObject:i1];
    33         NSLog(@"retaincount = %lu",[i1 retainCount]);//3
    34         
    35         
    36         //5.通过release释放对象的所有权
    37         [i1 release];
    38         NSLog(@"retaincount = %lu",[i1 retainCount]);//2
    39         
    40         
    41         //6.从容器中删除对象,也会释放对象所有权
    42         [array removeObject:i1];
    43         NSLog(@"retaincount = %lu",[i1 retainCount]);//1
    44         
    45         //7.最后再释放一次,对象才会被正常销毁
    46         [i1 release];  //此时,底层会调用dealloc方法     //0
    47     }
    48     return 0;
    49 }

        测试结果是:

    2015-08-13 17:32:36.408 02-MRC[1599:103515] retaincount = 1
    2015-08-13 17:32:36.409 02-MRC[1599:103515] retaincount = 1
    2015-08-13 17:32:36.410 02-MRC[1599:103515] retaincount = 2
    2015-08-13 17:32:36.410 02-MRC[1599:103515] retaincount = 3
    2015-08-13 17:32:36.410 02-MRC[1599:103515] retaincount = 2
    2015-08-13 17:32:36.410 02-MRC[1599:103515] retaincount = 1
    2015-08-13 17:32:36.410 02-MRC[1599:103515] integer dealloc
    Program ended with exit code: 0
  • 相关阅读:
    675 对象的引用-浅拷贝-深拷贝
    674 vue3侦听器watch
    673 vue计算属性:缓存,setter和getter
    明明有了promise,为啥还需要async await?
    Js常用数组方法汇总
    一些非常有用的Js单行代码
    Js获取验证码倒计时
    前端截取字符串:JS截取字符串之substring、substr和slice详解
    javascript全局变量与局部变量
    JS实现快速排序算法
  • 原文地址:https://www.cnblogs.com/XYQ-208910/p/4727984.html
Copyright © 2020-2023  润新知