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

2019-01-22  本文已影响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的操作了

上一篇下一篇

猜你喜欢

热点阅读