我对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
代替什么?)
答案 0 :(得分:3)
我应该用{<1}}替换什么?
您应该将x
替换为您计划与此指针一起使用的类的最具体的共同祖先的名称。在您的示例中,这将是x
,因为NSObject
和NSString
都继承了它,并且没有其他共同的祖先。在最坏的情况下,共同的祖先是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)
self
。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];
}