编辑2:除了Kurt的解决方案之外,还有一种方法可以做到这一点。看一下本页末尾,评论之前:http://www.friday.com/bbum/2009/09/11/class-extensions-explained/
<小时/>编辑:类类别中的类方法似乎无法访问私有(private)成员,例如 ivars 和通过类扩展实现的私有(private)方法。
<小时/>我希望这个问题之前没有被问过和回答,但我找不到一个问题,因为 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 可能不会自动合成,但它确实是合成的。
那么,我可以采取哪些途径来完成工作?
最佳答案
您的方法+[XYZPerson离婚:]
在XYZPersonMarriage.m
中定义,它是与XYZPerson.m
不同的编译单元,其中XYZPerson
的其余部分已实现。
因此,在编译 +divorce:
时,编译器不知道存在隐式合成的 _spouse
变量。就其所知,该属性可以由您实现的方法 -spouse
支持。
解决这个问题的方法:
将
+divorce
的实现移至XYZPerson.m
中。不要直接访问 ivars,而是通过真实方法完成工作。它们不必是类的常用公共(public)接口(interface)的一部分;它们可以通过仅
XYZPersonMarriage.m
导入的单独头文件公开。搜索“Objective-C 私有(private)方法”以获取有关该模式的优缺点的更多讨论。
关于objective-c - 在类方法中访问同一类实例的 ivar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14713284/