gpt4 book ai didi

objective-c - 初始化后直接取消分配内容 View Controller 的弹出窗口

转载 作者:行者123 更新时间:2023-11-29 04:49:35 24 4
gpt4 key购买 nike

我有一个奇怪的问题,UIPopovercontroller 在加载弹出窗口后立即释放其内容 View Controller ,然后重新初始化它。
我的目标是在弹出窗口被关闭时读取文本字段。

我的印象是,我创建了一个 UIViewController 并将其设置为弹出窗口的内容 View Controller 。然后 PopoverViewController 将保留内容 View Controller ,我可以(自动)释放它。
稍后,当弹出窗口被关闭时,它将释放弹出窗口(以及内容 View Controller )。但这是行不通的。这是我的相关代码:

- (IBAction)popoverButton:(id)sender {
// Create & Initialize content view controller
ContentViewController* cvc = [[[ContentViewController alloc] initWithNibName:@"ContentViewController" bundle:nil] autorelease];

// Create, initialize and load popover
popoverController = [[UIPopoverController alloc] initWithContentViewController:cvc];
[popoverController setDelegate:self];
[popoverController presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

NSLog(@"popoverButton: %@, retainCount: %d", cvc, [cvc retainCount]);
}

- (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)senderPopoverController
{
NSLog(@"popover should dismiss");
ContentViewController *dvc = (ContentViewController *)([popoverController contentViewController]);
NSLog(@"%@ %@ %@", dvc, [dvc testTextfield], [[[dvc testTextfield] text] description]);
return YES;
}

ContentViewController.m

- (void)viewDidLoad
{
[super viewDidLoad];
[[self testTextfield] setText:@"Bla"];
NSLog(@"viewDidLoad: %@", testTextfield);
}

- (void)dealloc {
NSLog(@"dealloc: %@", testTextfield);
[testTextfield release];
[super dealloc];
}

当我打开弹出窗口时,Log将是(我认为输出的顺序并不代表实际调用时的顺序):

Popover Test[2363:707] viewDidLoad: <UITextField: 0x185750; ...>
Popover Test[2363:707] viewDidLoad: (null)
Popover Test[2363:707] popoverButton: <ContentViewController: 0x1844e0>, retainCount: 4
Popover Test[2363:707] dealloc: <UITextField: 0x185750; ...>

当我忽略它时:

Popover Test[2363:707] popover should dismiss
Popover Test[2363:707] <ContentViewController: 0x1844e0> (null) (null)
Popover Test[2363:707] popover did dismiss
Popover Test[2363:707] <UIPopoverController: 0x184860>
Popover Test[2363:707] dealloc: (null)

所以我的问题是:

  1. 为什么 ContentViewController 会被释放并再次初始化?
  2. 为什么第二次加载时 socket (textField)不再工作?

如果我能解决这个问题,我将能够从 popoverControllershouldDismissPopover

中的文本字段中读取内容

最佳答案

由于 ContentViewController 是您的类,因此请实现适当的 init* 方法(如果您还没有),设置一个断点,调试器将在以下位置停止:每个分配,回答您关于为什么要重新创建它的问题。

请注意,retainCount 没有用;不要调用它。

<小时/>

啊——好的——所以,您在加载 nib 文件时创建了一个实例,并直接在代码中创建了第二个实例。相反,您需要一个连接到 nib 文件中的实例的导出。

至于retainCount; Calling -retainCount Considered HarmfulWhen to use -retainCount?

关于objective-c - 初始化后直接取消分配内容 View Controller 的弹出窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9072083/

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