更新:我认为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版本。
我在互联网上找到了这样的代码,并预计它会崩溃,但它没有。因此问题。