【发布时间】:2013-08-01 12:27:51
【问题描述】:
目前我没有在我的应用程序中使用 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】,为什么不崩溃?它甚至没有泄漏。
(2) 参考here,附件视图不应该被释放。但是,我尝试在 [alertView runModal] 之前释放视图,然后稍后获取它的 stringValue,这可以工作。为什么?
(3)函数retainCount的返回值很有意思。当我创建alertView对象时,alertView的retainedCount是3。(为什么?)
在[alertView setAccessoryView:accessory]之前,附件的retainedCount为1,执行后变为2。这是正常和正确的。但是,上面代码的日志结果,它们是20、21、22。它们是怎么来的?
感谢您的关注!
【问题讨论】:
标签: cocoa automatic-ref-counting nsalert accessoryview