0

目前我没有在我的应用程序中使用 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。它们是怎么来的?

感谢您的关注!

4

2 回答 2

3
  1. 它确实泄漏。在 dealloc 上放一个断点(或者创建一个 NSAlert 的子类并在 dealloc 中添加一个日志语句)来显示这个
  2. 附件视图应该被释放。你alloc它,然后它会被 alertView 保留
  3. 这是关于何时使用 retainCount的简明指南。
于 2013-08-01T13:08:23.277 回答
2
于 2013-08-01T13:57:38.880 回答