【问题标题】:Private instance variables - iPhone SDK私有实例变量 - iPhone SDK
【发布时间】:2010-10-03 17:44:30
【问题描述】:

我的 iPhone 应用程序中有一些变量作为类实例变量(它们之所以需要是因为它们在该类的多个方法中使用。

但是,我不希望它们暴露给父类。我见过@private 关键字,但我不确定这是否合适。

有人如何将实例变量保持为类私有?

这也可能是一个 Objective-C 问题,不一定特定于 iphone。

非常感谢, 布雷特

【问题讨论】:

  • 实例变量永远不会“暴露给父类”

标签: iphone objective-c


【解决方案1】:

@private 让您的意图明确并且是正确的方法。

编辑:

@interface YourClass : NSObject {
@private
    int privateData;
@public
    int publicData;
}

// method declarations....

@end

【讨论】:

  • 我还没有找到如何实现@private。有任何想法吗?我在哪里放置一组变量?我将如何将这些与我想公开的分开?非常感谢!
  • 这也可以与类方法一起使用吗? IE。 @private -(void)method1;
  • @private 不能用于具有类范围的任何变量(例如,可从类中的任何对象访问的单个公共内存位置)。
  • @hotpaw2:你投反对票了吗?问题是关于 instance 变量 - 被错误地称为“类实例”变量。
  • @Brett:不,只有 ivars 可以拥有私人访问权限。每个人都可以访问方法(或相关的属性)。
【解决方案2】:

Objective C 中的类实例变量(假设您的意思是可以在一个对象中设置并在同一类的另一个对象中读取的变量)与普通 ANSI C 中的静态全局变量相同(假设您放置一个类实现在一个 .m 文件中)。

静态全局变量不会暴露给任何其他类(超级、子、外星人等)或包含这些类实例变量的实现文件之外的代码。

此处其他答案中的 @private 声明内容很可能是不正确的(取决于您的术语的意思),因为这些实例变量不具有类范围的范围,但对每个单独的对象都是私有的(除非暴露按属性)。

【讨论】:

  • Brett 询问了他可以在多种方法中使用的变量 - 不能在多个实例之间共享。此外,Obj-C 中并没有真正的“类变量”(至少它们与类方法相比不是一个级别)。
【解决方案3】:

@private 指令意味着实例变量只能在声明它的类中访问。如果您希望子类可以访问实例变量,请使用 @protected 指令。当你说你不希望你的实例变量暴露给 parent 类时,我不确定你的意思是什么,但我很确定 @private 就是你想要的。

你使用这样的指令:

@interface MyClass : NSObject {
@private
    float privateFloat;
    float anotherPrivateFloat;
@protected
    float protectedFloat;
@public
    float publicFloat;
}

实例变量的默认范围是受保护的。

【讨论】:

  • 方法怎么样?有没有办法通过使用@private 指令来保持它们的私密性?
  • 我不知道。您可以使用具有空名称的类别来隐藏方法声明以声明“私有 API”,但据我所知,并未强制执行隐私。这就是为什么你会听说 iPhone 应用程序因为被称为 Apple 的“私有”方法而被拒绝的原因。看看这个问题:stackoverflow.com/questions/172598/…
猜你喜欢
  • 2011-01-23
  • 2012-04-10
  • 2013-07-07
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多