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

标签 objective-c cocoa-touch cocoa

编辑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/

相关文章:

iphone - 53 * .01 = .531250

objective-c - 为什么不需要取消引用 NSString 指针?

objective-c - 使用 Action 选择器预设将项目添加到 NSMenu

ios - 模糊 UIPickerView 的背景

ios - 像素化的 UIButton 边缘

objective-c - Assets 加载后立即定位到 AVPlayer 中的某个位置

objective-c - @property,setter 和 getter 问题?

objective-c - 如何 "Skin"Mac 上的应用程序?

cocoa - iTunes 歌曲队列

ios - 导航栏 Swift 中的文本颜色