gpt4 book ai didi

Objective-C:你能测试静态类类型的未初始化指针吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:20:35 24 4
gpt4 key购买 nike

我正在尝试按照以下方式做一些事情:

在某个对象 A 中:

UITableVIewController *viewController;
[someObjectB setupView: viewController];

在某个对象 B 中:

-(void) setupView:(UIViewController*)view
{
if the pointer passed in is of type UITableViewController then ...
say, for instance with: [[view class] isKindOfClass [UITableViewController class]]
or: [view isKindOfClass [UITableViewController class]]
}

但是,我有两个问题:首先,参数作为 UIViewController 进入 B 中的方法,它是 UITableView 的父类(super class)(我这样做是因为此方法还将配置其他类型的 View Controller )。所以我想知道,如果我将 UITableViewController 传递给 UIViewController 类型的方法参数,isKindOfClass 仍然会进行动态绑定(bind)吗?也就是说,运行时检查内容的类型,而不考虑指针的静态类型?

其次,请注意,在将对象 A 中的指针传递给 B 之前,我没有对其进行初始化。我实际上希望 B 对其进行初始化。但是问题就变成了,如何在未初始化的指针上测试静态指针类型?也就是说,在 B 内部:[view isKindOfClass [UITableViewController class]] 给了我一个 BAD_EXEC。我的猜测,因为我显然是在尝试访问一个 jul 指针。那么有没有办法仍然基于指针静态类型声明进行测试呢?

附录:(因为我将其添加为评论,抱歉)

让我用更具体的术语重新表述问题的这一部分:我希望 obj B 创建一个 UITableViewController 类型的变量,将其传递给 A 并让 A 意识到它已被赋予一个指向 UITableViewController 的指针,以便它可以实际初始化this 指向 UITableViewController 的特定子类,然后 obj B 将现在初始化的对象传递给其他对象。

我想要这样做的原因是以下场景:我有一个基于导航 Controller 的应用程序。它有一个带按钮的根 Controller ,根据按下哪个按钮,根 Controller 为数据库的不同表实例化并推送表 Controller ,反过来,当单击这些表的一行时,表实例化并推送详细 View Controller 。

到目前为止一切顺利,但由于项目的性质,我想让整个导航 Controller 实例化-推送链不知道有一个数据库以及表和详细 View Controller 实际上是的特定子类分别是 UITableViewController 和 UIViewController。

这意味着流程将是:

1- 单击时,根 Controller 将通用 UIViewController 传递到我的自定义主 Controller 。

2- 这个主 Controller 意识到它已经传递了一个通用表,将它初始化为我定义的特定子类,并做了一些事情来为它提供来自 sql 数据库的数据。

3 - 根 Controller ,不关心通用 UIViewController 是否是一个表,甚至是 UIViewController 的子类,只是将它推送到 navigationController。

还有一个想法是,我不需要在根 Controller 中包含表子类的 header 。只有自定义主 Controller 知道这些。

所以,归根结底,我认为这样做的方式是能够确定传递的指针的类型,而不管这个指针是 nil、指向垃圾还是指向一个实际对象。含义:

UIVIewController* a -> 静态类型声明,在编译时确定。

a = [UIVIewController 分配的某些子类] init]; -> 指针内容的动态类型,在运行时确定,可能通过激活记录跟踪链接。类似于 C++ 中的“虚拟”

最佳答案

正如其他人所指出的,您所要求的是不可能的。当您将变量传递给方法时,它只发送值,而不发送类型。此外,运行时不知道方法中变量的类型。任何变量类型处理都由编译器完成。运行时只能知道变量持有的对象的类。

作为替代方案,如果您可以更改方法的签名,则可以添加一个参数来指示要创建的对象的类型。调用方法仍然不需要知道对象的确切类型,只需要知道它是否是一个 TableView Controller 。下面是一个使用枚举来保存不同类型的示例。

// header

enum ViewControllerType {
ViewControllerNormal = 0,
ViewControllerTableView
};
- (void)setupView:(UIViewController **)view ofType:(enum ViewControllerType)type;

// implementation

- (void)setupView:(UIViewController **)view ofType:(enum ViewControllerType)type {
if(!view) {
NSLog(@"setupView:ofType: received nil pointer");
return;
}
switch(type) {
case ViewControllerNormal:
// create normal UIViewController type
break;
case ViewControllerTableView:
// create UITableViewController type
break;
default:
NSLog(@"setupView:ofType: received unknown type: %i",type);
return;
}
}

像这样使用:

UIViewController *view;
[creatorObject setupView:&view ofType:ViewControllerNormal];
// or
UITableViewController *tableView;
[creatorObject setupView:&tableView ofType:ViewControllerTableView];

关于Objective-C:你能测试静态类类型的未初始化指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7680310/

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