----------------------------------------------------------------------------------------------------------
| 转载请注明出处:http://blog.youkuaiyun.com/cywn_d/article/details/18358669 |
-----------------------------------------------------------------------------------------------------------
注意事项:
1.删除所有retain,release和autorelease。
2.把原来property写retain和assign的地方替换成strong或者weak.
3.dealloc并没有做除了release和super dealloc之外的任何事情,直接删除整个delloc方法就可以了。
4.不使用ARC的文件,在Build Phases-Compile Sources的文件中双击,输入-fno-objc-arc。
5.如果引用了非ARC的framework文件,并且该文件出现ARC不支持的错误,只能将引用了该文件的.m文件改成非ARC。要注意的是,不能在.pch中直接声明这个framework文件,只能在用到该framework的时候引入。
可能出现的问题及解决方法:
1.ARC forbids Objective-C objects in structs or unions
ARC不允许结构体中定义对象,一个方法就是取消结构体,直接在外面定义。
2.Receiver type ‘X’ for instance message is a forward declaration
这往往是引用的问题。ARC要求完整的前向引用,也就是说在MRC时代可能只需要在.h中申明@class就可以,但是在ARC中必须在.m文件重声明对该类.h文件。
示例:
TestA有test1()方法。
TestB继承了TestA,但未重写test1方法。
TestC.h通过@class引用TestB,并声明了TestB testB;对象。
TestC.m中未引用TestB.h,直接调用testB.test1()方法。
3.Switch case is in protected scope
现在switch语句必须加上{}了,ARC需要知道局部变量的作用域,加上{}后switch语法更加严格,否则遇到没有break的分支的话内存管理会出现问题。
4.A name is referenced outside the NSAutoreleasePool scope that it was declared in
这是由于写了自己的autoreleasepool,而在转换时在原来的pool中申明的变量在新的@autoreleasepool中作用域将被局限。解决方法是把变量申明拿到pool的申请之前。示例:
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
NSArray* sortedResults =[[filteredResults sortedArrayUsingSelector:@selector(compare:)] retain];
[pool release];
return [sortedResults autorelease];
以上代码如果通过X-Code的ARC转换工具转换,会变成:
@autoreleasepool
{
NSArray* sortedResults = [filteredResults sortedArrayUsingSelector:@
selector(compare:)];
}
return sortedResults;
5.Cast of Objective-C pointer type 'NSURL *' to C pointer type 'CFURLRef' (aka 'const struct __CFURL *') requires a bridged cast
在CFURLRef前加上__bridge,即__bridge CFURLRef
6.init methods must return a type related to the receiver type
方法返回的类型不对。如果这个问题出现在自己写的类,直接修改就可以,如果是出现在framework里,只能把引用了这个framework的.m文件加上-fno-objc-arc,编程非ARC的。
7.Multiple methods named 'handleResponseData:' found with mismatched result, parameter type or attributes
这是由于两个方法具有相同的方法名,编译器可能在某些情况下无法分辨。比如:
- (void)handleResponseData:(NSString *) data;
- (void)handleResponseData:(NSData *) data;
调用方式:
[instance performSelector:@selector(handleResponseData:) withObject:object];
这时候就会报错。
8.Assigning retained object to unsafe_unretained variable; object will be released after assignment
由于将一个对象声明为weak,示例:
__weak NSString *str = [[NSString alloc] initWithFormat:@"%d",2];
NSLog(@"%@", str);
输出为(null)