我想直接将值同时直接分配给类的ivar。
我知道使用setter方法(self.target = ...
)会出现问题,因为ARC内部保留并释放了strong
属性的内容。 但是我正在尝试使用ivar。
是因为隐式限定符__strong
吗?但是_target
是一个ivar,因此它不会在每个dispatch_async块之外释放,对吗?
如果您将字符串缩短,iOS系统将对_target
应用带标记的指针,为什么在这种情况下不再发生错误的访问错误?
@interface ClassA ()
@property (nonatomic, strong) NSString *target;
@end
@implementation ClassA
- (void)test {
dispatch_queue_t queue = dispatch_queue_create("parallel", DISPATCH_QUEUE_CONCURRENT);
for (int i = 0; i < 10000 ; i++) {
dispatch_async(queue, ^{
_target = [NSString stringWithFormat:@"aaaaaaaaaaaaaa-%d",i]; //Bad Access Error in releasing, an NSCFString
//_target = [NSString stringWithFormat:@"aa-%d",i]; //No problem, an NSTaggedPointerString
});
}
}
@end
int main(int argc, char * argv[]) {
ClassA *obj = [[ClassA alloc] init];
[obj test];
return 0;
}
答案 0 :(得分:1)
使用ivar
没什么区别:编译器只是添加保留/释放而不是您。您需要unsafe_unretained
属性以禁止插入保留/释放