在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 了。
结论
综上所述:第二条描述貌似是错误的(估计是以前的版本),反正现在的版本是会对参数进行
retain
和release
的操作了
网友评论