Objective-C:指向不同时间差异类的指针

时间:2013-01-02 16:43:56

标签: objective-c ios class pointers

我对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代替什么?)

5 个答案:

答案 0 :(得分:3)

  

我应该用{<1}}替换什么?

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

一般来说,在大多数情况下都应该避免使用这样的技巧,因为重复使用指针真正不同的东西会对可读性造成不利影响。

答案 1 :(得分:1)

如果你想要一个指向在编译时尚未知道的类型的对象的指针(类似于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

答案 2 :(得分:0)

  1. 如果您正在处理实例类,则指向类本身的指针只是self
  2. 如果您正在使用class pointer,则可以使用id类型,因为它是通用类型。如果要调用此类的某些方法,请确保使用isKindOfClass方法使您正在处理的对象具有预期类型。

答案 3 :(得分:0)

  

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

我想你要求相当于C ++模板。

你不能这样做,你不需要它,只需使用id类型:

id foo= @"some text";

答案 4 :(得分:0)

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

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

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

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