ios-__autoreleasing修饰符

来源:互联网 发布:销售pipeline数据 编辑:程序博客网 时间:2024/06/07 00:22

最近看到有些方法中里面要求传入的参数的是需要传入__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



原创粉丝点击