为什么在ARC下取消分配“assign”属性?纯粹的运气?

时间:2015-11-26 10:23:57

标签: objective-c automatic-ref-counting

更新:我认为ARC下的默认行为是assign,但它是strong。所以,不要费心阅读这个问题,这是无用的:)

请考虑以下代码:

#import "AppDelegate.h"

@interface TestClass: NSObject
@property (atomic) NSMutableArray *strings; //"assign" by default
@end
@implementation TestClass
@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    TestClass *testObject = [TestClass new];
    testObject.strings = [[NSMutableArray alloc] init];
    //(*) Why isn't strings array deallocated here under ARC? There are no strong references to it.
    [testObject.strings addObject:@"str1"];
    [testObject.strings addObject:@"str2"];
    [testObject.strings addObject:@"str3"];
    NSLog(@"Strings: %@", testObject.strings);
    return YES;
}
@end

此处strings属性声明为assign(默认情况下)。所以,如果我没有弄错的话,代码中根本没有对这个数组的强引用。因此,从我的观点来看,strings应该在(*)处取消分配。但是,代码可以工作并打印数组。

为什么呢?我可能的解释是,有一些与NSMutableArray相关的实现细节,因此有一些内部引用留给strings数组,因此它仍然有效。所以这只是纯粹的运气。我对吗?我已经欺骗系统返回retainCount,在2点等于NSLog

如果我将属性声明更改为(atomic, weak),则数组按预期为nil

我将Xcode 7.1.1(7B1005)与OS X 10.11.2(15C30)一起使用。我检查了iOS模拟器中的DEBUG版本。

我在互联网上找到了这样的代码,并预计它会崩溃,但它没有。因此问题。

1 个答案:

答案 0 :(得分:1)

在ARC下,默认所有权为strong而不是assign,有关详细信息,请参阅Clang ARC documentation