ARC:自动引用计数。编译器帮助插入retain和release,无需自己动手,更稳定。
1. 结构里边不能有oc指针对象 。 arc只对可保留的指针对象(ROPs)有效: 1)代码块指针 2)Objective-C对象指针 3)通过 __attribute__((NSObject))类型定义的指针。 结构不属于可保留的指针对象,不能自动计数,oc指针可以。当结构体中有一个oc对象指针时,编译器不知道oc对象指针的所有权是指针的,还是结构的,无法判断是否对结构中的oc指针是否做自动计数。有两种解决方式:1)通过使用void*和桥接转换来解决问题。把oc对象类型设为void,并在给结构的void指针赋值的时候把指针的管理权限赋给结构。 2)把结构转换为oc的类。第二种方法比较推荐。
参考自Objecttive-C基础教程(第二版) 9.2.4 自动引用计数
2.init开头的方法返回的对象必须和接收对象一致。例如,不能以init开头的方法返回父类。改为arcInit。对象生成和持有的方法必须是alloc,new,copy,mutableCopy等开头的方法。init开头的方法必须是实例方法,且必须要返回对象。
3.multiple methods named 'count' found with mismatched result, parameter type or attributes.问题。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
@interface
TestCounter :
NSObject
- (TestCounter *)count;
@end
int
main(
int
argc,
char
*argv[])
{
@autoreleasepool
{
// id obj = [[A alloc] init];
// [obj show];
// [obj mul:123.12];
[(
id
)[TestCounter
new
] count];
}
return
0;
}
|
这个例子一样会报同样的错误,这是为什么呢?我取得了一个TestCounter的实例,但是我把它转为了id类型,然后用id类型调用了count方法,此时编译器会 遍历所有的可见头 的count方法,编译器当然会找到多个定义,因为count方法在NSArray,NSSet等等这些类上也有实现,而且我的TestCounter的count方法返回的是一个TestCounter对象,这和NSArray,NSSet等的count方法返回NSUInteger类型不一样,所以编译器会给你一个异常,注意看这个异常描述:
multiple methods named 'count' found with mismatched result , parameter type or attributes .
那为什么把NSArray转成id类型调用count方法不会有错呢?因为Foundation框架的
所有count方法的返回值都是一个NSUInteger类型
,编译器找到的签名自然都是一样的。
4.Receiver type 'X' for instance message is a forward declaration
前向引用的问题。ARC要求完整的前向饮用。在mrc中只需要在.h中申明@class就可以。但是在arc中必须引用.h。
5.NSString *theString = @"testArc";
CGStringRef cfString = (CGStringRef)theString; 需要加一个桥接。 (_bridge)
6.仍然调用dealloc方法,但是在dealloc方法里不能做[super dealloc]操作。
用xcode自带转换的时候,xcode做的操作:
1.retain 置换为strong, 自动
2.assign置换为weak,自动(id对象)
3.去掉retain, release, autorelease,自动
附一篇对arc介绍很好的文章:http://www.onevcat.com/2012/06/arc-hand-by-hand/