目前我没有在我的应用程序中使用 ARC,我尝试创建一个 NSAlert 对象作为局部变量,在函数结束时,我没有释放它。我预计应用程序会因此崩溃,功能代码在这里。
#define GLOBAL_VARIABLE 0
NSString *msgText = [self.defaultValueTextFiled stringValue];
NSString *informativeText = @"Informative Text";
#if !GLOBAL_VARIABLE
NSAlert *alertView = nil;
#endif
if (alertView == nil)
{
alertView = [[NSAlert alloc] init];
[alertView setMessageText:msgText];
[alertView setInformativeText:informativeText];
NSTextField *accessory = [[NSTextField alloc] initWithFrame:NSMakeRect(0,0,200,22)];
[accessory setStringValue:@"accessory result"];
[alertView setAccessoryView:accessory];
}
NSView *accessory= nil;
NSInteger result = [alertView runModal];
if (result == NSAlertAlternateReturn)
{
accessory = [alertView accessoryView];
if (accessory != nil)
{
NSTextField *txtFiled = (NSTextField *)accessory;
NSLog(@"%ld", [accessory retainCount]);
NSString *str = [txtFiled stringValue];
NSLog(@"%ld", [accessory retainCount]);
[self.resultValueTextField setStringValue:str];
NSLog(@"%ld", [accessory retainCount]);
}
}
问题:(1)到底没有【alertView release】,为什么不crash?它甚至没有泄漏。
(2) 参考这里,附件视图不应该被释放。但是,我尝试在 [alertView runModal] 之前释放视图,然后稍后获取它的 stringValue,这可以工作。为什么?
(3)函数retainCount的返回值很有意思。当我创建 alertView 对象时,alertView 的 reservedCount 为 3。(为什么?)
在[alertView setAccessoryView:accessory]之前,附件的retainedCount为1,执行后变为2。这是正常和正确的。但是,上面代码的日志结果,它们是 20、21、22。它们是怎么来的?
感谢您的关注!