0

我对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?)

4

5 回答 5

3

我应该用什么代替x

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

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

于 2013-01-02T16:55:17.180 回答
1

如果您想要一个指向在编译时未知的类型的对象的指针(类似于dynamicC#),请使用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
于 2013-01-02T16:47:57.777 回答
0
  1. 如果您正在处理实例类,则指向该类本身的指针就是self.
  2. 如果您正在处理 a ,则class pointer可以只使用该id类型,因为它是泛型类型。isKindOfClass如果要调用此类的某些方法,请使用该方法确保您正在处理的对象是预期的类型。
于 2013-01-02T16:47:35.020 回答
0

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

我想您要的是等效的 C++ 模板。

你做不到也不需要它,只需要使用 id 类型:

id foo= @"some text";
于 2013-01-02T16:55:14.863 回答
0

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

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

您可以,以确保您具有预期的对象类型,isKindOfClass用于检查类型:

if ([genericPointer isKindOfClass:[NSArray class]]) {
    NSString* arrayElement = [(NSArray)genericPointer objectAtIndex:x];
}
于 2013-01-02T16:57:52.080 回答