gpt4 book ai didi

cocoa - 没有ARC,应用程序不会在不释放手动创建的对象的情况下崩溃

转载 作者:行者123 更新时间:2023-12-03 17:30:17 28 4
gpt4 key购买 nike

目前我没有在我的应用程序中使用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发布】,为什么不崩溃?甚至没有泄漏。

(2) 参见here ,不应释放附件 View 。但是,我尝试在 [alertView runModal] 之前释放 View ,然后稍后获取其 stringValue,这可以工作。为什么?

(3) 函数retainCount 的返回值很有趣。当我创建alertView对象时,alertView的retainedCount是3。(为什么?)

在[alertView setAccessoryView:accessory]之前,accessory的retainedCount为1,执行后变为2。这是正常且正确的。然而,上面代码的日志结果,它们是20,21,22。它们是怎么来的?

感谢您的关注!

最佳答案

  1. 它确实泄漏了。在 dealloc 上放置断点(或创建 NSAlert 的子类并向 dealloc 添加日志语句)以显示此内容
  2. 附件 View 应该被释放。您分配它,然后它会被alertView保留
  3. 这是关于 when to use retainCount 的简明指南.

关于cocoa - 没有ARC,应用程序不会在不释放手动创建的对象的情况下崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17994056/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com