mrc项目转arc注意点

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 resultparameter type or attributes.问题。
bjective C code
?
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/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值