美文网首页
ARC与MRC下给方法传递参数引用计数探究

ARC与MRC下给方法传递参数引用计数探究

作者: 传说中的汽水枪 | 来源:发表于2019-01-22 10:56 被阅读3次

    Objective-C Automatic Reference Counting (ARC)有如下这段话:

    In general, ARC does not perform retain or release operations when simply using a retainable object pointer as an operand within an expression. This includes:

    • loading a retainable pointer from an object with non-weak ownership,
    • passing a retainable pointer as an argument to a function or method, and
    • receiving a retainable pointer as the result of a function or method call.

    一般来说,当在表达式中简单的使用一个可保持对象指针的时候,ARC不会执行retain和release操作。这包括以下情况:

    • 从一个非弱从属关系对象加载一个可保持指针
    • 把一个可保持指针作为参数传递给一个函数或者方法,和
    • 收到一个可以保持指针作为函数或方法的结果。

    现在对第二条进行相关的测试与验证
    passing a retainable pointer as an argument to a function or method

    第一条可以参考:ARC与MRC下变量赋值引用计数探究

    一个临时类:

    RXARCTmpObject

    @implementation RXARCTmpObject
    - (NSString *)description
    {
        return NSStringFromClass([self class]);
    }
    - (void)dealloc
    {
        NSLog(@"RXARCTmpObject dealloc");
    }
    @end
    

    MRC情况下

    RXMRCObject这是是一个mrc编译模式的文件

    @implementation RXMRCObject
    - (void)_foo:(id)x
    {
        NSUInteger count = [x retainCount];
        NSLog(@"count in foo method:%zd", count);
    }
    - (void)_test_method_argument
    {
        RXARCTmpObject *object = [[RXARCTmpObject alloc] init];
        
        NSUInteger count = [object retainCount];
        NSLog(@"count after alloc init:%zd", count);
       
        [self _foo:object];
        
        count = [object retainCount];
        NSLog(@"count before release:%zd", count);
        [object release];
    }
    @end
    
    

    输出结果是:

    count after alloc init:1
    count in foo method:1
    count before release:1
    RXARCTmpObject dealloc
    

    在MRC下,传递可保持对象指针参数不会对参数添加任何引用

    ARC情况下

    获取引用计数

    RXMRCUtil 这是是一个mrc编译模式的文件

    @implementation RXMRCUtil
    + (NSUInteger)objectRetainCount:(id)object
    {
        return [object retainCount];
    }
    @end
    

    RXARCObject

    @implementation RXARCObject
    - (void)_foo:(id)x
    {
        NSUInteger count = [RXMRCUtil objectRetainCount:x];
        NSLog(@"start count _foo_not_attribute:%zd", count);
        
        
        count = [RXMRCUtil objectRetainCount:x];
        NSLog(@"end count in _foo_not_attribute:%zd", count);
    }
    
    - (void)_test_method_argument
    {
        RXARCTmpObject *object = [[RXARCTmpObject alloc] init];
        
        NSUInteger count = [RXMRCUtil objectRetainCount:object];
        NSLog(@"start count outside method:%zd", count);
        
        [self _foo:object];
        
        count = [RXMRCUtil objectRetainCount:object];
        NSLog(@"end count outside method:%zd", count);
    }
    @end
    

    输出结果:

    start count outside method:1
    start count _foo_not_attribute:2
    end count in _foo_not_attribute:2
    end count outside method:1
    RXARCTmpObject dealloc
    

    在ARC下,传递可保持对象指针参数的时候,会在开始处添加retain,在结尾处添加release,所以在内部的时候,它的retaincount +1 了。

    结论

    综上所述:第二条描述貌似是错误的(估计是以前的版本),反正现在的版本是会对参数进行retainrelease的操作了

    相关文章

      网友评论

          本文标题:ARC与MRC下给方法传递参数引用计数探究

          本文链接:https://www.haomeiwen.com/subject/idcljqtx.html