Objective c 访问子类实例

Objective c 访问子类实例,objective-c,cocoa,Objective C,Cocoa,我有一个类,其实例变量为NSArray,我知道不同的对象应该从同一个超类继承。我的问题是如何从另一个类(其控制器)访问实例变量和方法,同时确保数组的内容只包含属于某个类的子类的对象?我尝试实现一个最小协议,并将数组中的对象引用为typeid和(id*),但这不允许我访问数组中类的任何实例变量或方法(这是正确的)。 在对象文件中 NSArray* components; // contains subclasses of component 在控制器文件中 subclassofClassObje

我有一个类,其实例变量为
NSArray
,我知道不同的对象应该从同一个超类继承。我的问题是如何从另一个类(其控制器)访问实例变量和方法,同时确保数组的内容只包含属于某个类的子类的对象?我尝试实现一个最小协议,并将数组中的对象引用为type
id
(id*)
,但这不允许我访问数组中类的任何实例变量或方法(这是正确的)。 在对象文件中

NSArray* components; // contains subclasses of component
在控制器文件中

subclassofClassObject* object; 

是否有函数、宏、类型定义的子类。。。etc或一种变通方法,以便我可以从控制器的子类引用对象子类中的组件子类。i、 e替换子类的内容。

我不太明白您的要求,但以下内容可能会有所帮助:

您可以使用
isKindOfClass:
确定是否有类的实例或其子类之一。例如,给定一个类
MyBaseClass
,然后使用强制转换:

id elem = [components objectAtIndex:ix];
if ([elem isKindOfClass:[MyBaseClass class]])
{
   // elem is an instance of MyBaseClass or one of its subclasses so cast is safe
   MyBaseClass *mbc = (MyBaseClass *)elem;
   // now can access methods, properties and public instance variables
   // of MyBaseClass via mbc without warnings
   ...
}

我建议你先考虑一下你的建筑设计。您可以尝试在子类实现中移动逻辑:

@interface BaseClass: NSObject {
}
...
- (void) doMySuperImportantStuff: (id)data;
@end

@implementation BaseClass
...
- (void) doMySuperImportantStuff: (id)data
{
  // basic implementation here, or common actions for all subclasses
  NSLog(@"BaseClass is here");
}
@end


@interface ClassA: BaseClass
{
NSInteger i;
}
...
@end

@implementation ClassA
...
- (void) doMySuperImportantStuff: (id)data
{
  // some specific stuff
  NSLog(@"ClassA is here, i=%d", i);
}
@end


@interface ClassB: BaseClass
{
  NSString *myString;
}
...
@end

@implementation ClassB
...
- (void) doMySuperImportantStuff: (id)data
{
  // another specific stuff
  NSLog(@"ClassB is here, myString = %@", myString);
}
@end

// client code example
....
NSArray *list = ...; // list of instances of the subclasses from BaseClass
for(BaseClass *item in list) {
  [item doMySuperImportantStuff: userData];
}

请遵守惯例,以大写字母开始类名(以小写字母开始方法名):-)啊。。。铸造我忘了。Yery很有帮助,谢谢。您确定需要
id*
类型的变量吗?这将是指向
id
的指针,该id本身已经是指向Cocoa对象的指针。