【问题标题】:Objective-C: a Pointer That Points to Difference Classes at Different TimeObjective-C:指向不同时间不同类的指针
【发布时间】:2012-12-17 00:55:38
【问题描述】:

我对 Objective-C 并没有真正的经验。这是我遇到的一个问题。

当我想为一个类的特定实例定义一个指针时,我可以

NSString* foo;

但是可以为这样的类的实例定义指针吗?

x* hotdog;  //"x" is the type of pointer hotdog is

hotdog = NSString;  //now points to NSString

hotdog* foo;  //an instance of NSString is created

hotdog = UIView;  //now points to UIView

hotdog* foo;  //an instance of UIView is created

如何定义类指针hotdog? (我应该用什么替换x?)

【问题讨论】:

    标签: objective-c ios class pointers


    【解决方案1】:

    我应该用什么替换x

    您应该将x 替换为您计划与此指针一起使用的类的最具体的共同祖先的名称。在您的示例中,这将是 NSObject,因为 NSStringUIView 都继承了它,并且没有其他共同的祖先。在最坏的情况下,共同祖先是id

    一般来说,在大多数情况下都应该避免使用类似的技巧,因为将指针重用于真正不同的东西不利于可读性。

    【讨论】:

    • 谢谢!我会去NSObject 然后:)
    【解决方案2】:

    如果你想要一个指向编译时未知类型的对象的指针(类似于 C# 中的dynamic),请使用id

    id hotdog;
    hotdog = [[NSString alloc] init];
    hotdog = [[NSArray alloc] init];
    

    仅在您真正需要时才这样做。如果你到处使用它,你的代码很容易变得一团糟,因为你会忘记变量的类型。


    起初我误解了你的问题。我会在这里留下我的旧答案,以防将来的访问者需要它。

    类指针的类型是Class,要获取该类型的对象,请使用+[NSObject class]

    Class hotdog = [NSString class]; // now points to NSString
    NSString *myString = [[hotdog alloc] init]; // create instance of NSString
    
    hotdog = [NSArray class]; // now points to NSArray
    NSArray *myArray = [[hotdog alloc] init]; // create instance of NSArray
    

    【讨论】:

    • 可以,但你不应该。 :)
    • 这段代码是正确的,但我相信它不能回答问题。他要求在objective-c中使用模板。
    • 谢谢!虽然这不是我真正想要的,但我认为这是最接近我想要的:)
    • @Arch 你到底在找什么?如果我没看错你的问题,你想要指向类的指针。 hotdog 在我的示例中是一个指向类的指针。
    • @Arch 因为您有一个变量在不同时间保存不同类型的对象。这很容易变得一团糟。如果你真的需要它,当然,使用它,但不要到处使用它。
    【解决方案3】:

    您可以使用NSObject*id 作为指针类型。 NSObject* 将接受 NSObject 的任何子类,而 id 也将接受其他 Objective-C 对象。

    请注意,为避免编译器警告消息,您必须在应用任何类型的取消引用操作(NSObject 的方法除外)之前将指针类型转换回(可能已知的)实际类型。

    您可以使用isKindOfClass 来检查类型,以确保您拥有预期的对象类型:

    if ([genericPointer isKindOfClass:[NSArray class]]) {
        NSString* arrayElement = [(NSArray)genericPointer objectAtIndex:x];
    }
    

    【讨论】:

      【解决方案4】:

      但是可以为这样的类的实例定义指针吗?

      我想您要求的是 C++ 模板的等价物。

      做不到也不需要,直接使用id类型即可:

      id foo= @"some text";
      

      【讨论】:

        【解决方案5】:
        1. 如果您正在处理实例类,则指向该类本身的指针就是self
        2. 如果您正在处理class pointer,您可以只使用id 类型,因为它是一个泛型类型。如果要调用此类的某些方法,请使用 isKindOfClass 方法确保您正在处理的对象属于预期类型。

        【讨论】:

        • 抱歉标题有误导性。我说的是一种指针(如果存在),它可以在不同时间指向不同的类。
        • 是的,我刚刚意识到 :-)
        猜你喜欢
        • 1970-01-01
        • 2016-10-24
        • 1970-01-01
        • 1970-01-01
        • 2023-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多