在类方法中访问同一类的实例的ivar

时间:2013-02-05 17:23:54

标签: objective-c cocoa-touch cocoa

编辑2:除了Kurt的解决方案之外,还有一种方法可以做到这一点。在评论之前看一下本页末尾:http://www.friday.com/bbum/2009/09/11/class-extensions-explained/


编辑:似乎类类中的类方法无法访问通过类扩展实现的ivars和私有方法等私有成员。


我希望之前没有问过这个问题,但是我找不到一个,因为stackoverflow和Google搜索都会在我的浏览器窗口中发出一些问题,这些问题要求直接从类方法访问ivar,这显然不是我的意图。

直接问题,我将提供一段代码,总结了我想要实现的目标:


XYZPerson.h:

@interface XYZPerson : NSObject
@property (weak, readonly) XYZPerson *spouse;
@end

XYZPersonMariage.h:

@interface XYZPerson (XYZPersonMariage)
+(BOOL)divorce:(XYZPerson *) oneOfSpouses;
@end

XYZPersonMariage.m

+(BOOL)divorce:(XYZPerson *)oneOfSpouses
{
  XYZPerson *otherSpouse = [oneOfSpouses spouse];
  if(otherSpouse != nil)
  {
    oneOfSpouses->_spouse = nil;
    otherSpouse->_spouse = nil;
    return true;
  }
  return false;
}

我首先想到的是,对于标记为只读的属性,可能不会自动合成ivar,但它确实是合成的。

那么,我可以采取哪些途径来完成工作?

1 个答案:

答案 0 :(得分:2)

您的方法+[XYZPerson divorce:]XYZPersonMarriage.m中定义,这是一个与XYZPerson.m不同的编译单元,其中XYZPerson的其余部分已实现。

因此,在编译+divorce:时,编译器不知道有一个隐式合成的_spouse变量。尽管如此,该属性可以由您实现的方法-spouse支持。

如何解决这个问题:

  • +divorce的实施方式移至XYZPerson.m

  • 不要直接访问ivars,而是通过实际方法完成工作。它们不必是该类通常的公共接口的一部分;它们可以通过仅XYZPersonMarriage.m导入的单独头文件公开。搜索“Objective-C私有方法”,以便更多地讨论该模式的优缺点。