ios-__autoreleasing修饰符

最近看到有些方法中里面要求传入的参数的是需要传入__autoreleasing修饰符的,搜罗了一些资料,这里做下记录

就比如说下面的这个方法就要求我们传入的参数类型是NSError *__autoreleasing *

这里需要注意的是如果我们之前定义的是NSError * error,编译器会帮我们隐式的去做NSError *__autoreleasing tempError = error;这么一个操作,然后据说还会做以下的操作

也就是说先前我们是直接把&error传进去的,这里编译器帮我们做了一个替换。所以如果我们为了提高点效率,反正编译器都会进行转换,那还不如我们自己去写上好了,这样好比较好,编译器去找和替换肯定也是需要时间的。所以我们最好都定义成NSError *__autoreleasing error;

 
    NSData  * data;
    NSError * error;
    NSError *__autoreleasing tempError = error; // 编译器添加
    if (![data writeToFile:@" " options:NSDataWritingAtomic error:&tempError])
        {
              error = tempError; // 编译器添加
              NSLog(@"Error: %@", error);
        }
加上了__autoreleasing,相当于就是在创建这个变量的时候会在后面加了一个autorelease操作,还有就是在ARC中如果像这种NSxxxx ** 类型的如果不加修饰符,编译器会默认的将其加上__autoreleasing修饰符。

还有就是有的时候需要注意的是可能我们在使用容器的block版本的枚举器的时候,系统会自动添加一个autoreleasePool,如果在这个时候我们在这个block里面使用了我们定义的用__autoreleaseing修饰符的变量,那这个变量就会被释放掉,可能我们接下来想要做的操作就无法进行了。

还有需要注意的其实就是修饰符的写法正确的写法应该是

NSString * __weak str = @"hhhh";

而不是 __weak NSString * str1=@"kkkk";

这个可能就会有人问了那为什么下面的写法也可以呢?因为编译器帮我们做了处理,好像文档有这么一句话Other variants are technically incorrect but are “forgiven” by the compiler. To understand the issue



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值