在iOS6和xCode4.5上运行ARC

在iOS6和xCode4.5上运行ARC,ios6,automatic-ref-counting,xcode4.5,Ios6,Automatic Ref Counting,Xcode4.5,我使用下面的代码来测试arc并帮助理解arc NSArray __strong* myArray = [NSArray arrayWithObjects:@"123", nil]; NSArray __weak* yourArray = myArray; NSArray __unsafe_unretained* theirArray = yourArray; myArray = nil; NSLog(@"yourArray = %@, theirArray = %@", yourArray

我使用下面的代码来测试arc并帮助理解arc

NSArray __strong*  myArray = [NSArray arrayWithObjects:@"123", nil];
NSArray __weak*  yourArray = myArray;
NSArray __unsafe_unretained*  theirArray = yourArray;
myArray = nil;
NSLog(@"yourArray = %@, theirArray = %@", yourArray, theirArray);
据我所知,日志应该是:yourArray=(null),theirArray=(null) 从表面上看,日志是: yourArray=( 123 ),他们的收入=( 123 )

如果我更改代码并删除“不安全”未恢复的:

NSArray __strong*  myArray = [NSArray arrayWithObjects:@"123", nil];
NSArray __weak*  yourArray = myArray;
//NSArray __unsafe_unretained*  theirArray = yourArray;
myArray = nil;
NSLog(@"yourArray = %@", yourArray);
日志是正确的:yourArray=(null)

为什么如果我向弱引用我的NSArray对象添加uu不安全的u未恢复的局部变量,就像保留或加强我的NSArray对象一样

任何人都可以帮助回答这个疑问


致以最诚挚的问候

在这种范围有限的简单示例中,编译器非常擅长计算对象的生命周期。它可以告诉您,在到达作用域的末尾之前(或者通过这些简单的赋值至少到达最后一次读取的末尾),它不应该释放数组


如果您使用标记为
\uuuuu unsafe\u unrepaired
的ivar,在弱分配之后分配它,并以完全优化的方式构建,您可能会看到不同的结果,即使在这种简单的情况下也是如此。此外,基本上,虽然编译器可以处理这样的情况,即
\uuuu弱
变量仍然被设置,而
\uuuuuu不安全
变量仍然能够被读取而不会发生灾难,但关键是您不能指望它会这样做。您可以指望的是,
\uuuuu弱
变量在其最后一个
\uuuu强
引用消失后将为零,并且编译器不会为
\uu不安全
变量插入保留/释放指令。只要你遵守规则,你就会有可预测的结果。一旦你不遵守规则,任何发生或未发生的事情都是未定义的。。。因此,它可以在模拟器和iPod4G上工作,但在4S和5上会出现可怕的故障,而在任何iPad上工作的时间只有一半。。。关键是,结果未定义。

由[NSArray arrayWithObjects:@“123”,nil]返回的对象将自动删除,并且在刷新自动删除池之前不会解除分配。在解除分配对象之前,弱引用不会为零。不安全的未恢复引用将永远不会为零,并且一旦对象被解除分配,该引用将变得无效

所以日志应该是

yourArray=(123),theirArray=(123)

但稍后当对象被释放时,它应该被释放

yourArray=(NULL),theirArray=未定义


未定义,因为指针无效,可能指向新对象或垃圾,如果我更改为[[NSArray alloc]initWithObjects:@“123”,nil],它甚至可能使代码崩溃

;这个返回对象没有自动删除,但是有相同的问题。谢谢,我知道了__不安全的未恢复的赋值弱不是一种好的编程方式。这个结果是基于xcode编译器的,所以这个测试结果建议我使用uuu弱,而不是所有的uuu不安全的u未保存,而不是交叉引用。