编辑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,但它确实是合成的。
那么,我可以采取哪些途径来完成工作?
答案 0 :(得分:2)
您的方法+[XYZPerson divorce:]
在XYZPersonMarriage.m
中定义,这是一个与XYZPerson.m
不同的编译单元,其中XYZPerson
的其余部分已实现。
因此,在编译+divorce:
时,编译器不知道有一个隐式合成的_spouse
变量。尽管如此,该属性可以由您实现的方法-spouse
支持。
如何解决这个问题:
将+divorce
的实施方式移至XYZPerson.m
。
不要直接访问ivars,而是通过实际方法完成工作。它们不必是该类通常的公共接口的一部分;它们可以通过仅XYZPersonMarriage.m
导入的单独头文件公开。搜索“Objective-C私有方法”,以便更多地讨论该模式的优缺点。