【问题标题】:Are private variables in Objective-C strong?Objective-C 中的私有变量是否强大?
【发布时间】:2013-03-24 16:39:40
【问题描述】:

所以搜索 Stack Overflow 这似乎是如何在 Objective-C 中制作私有变量:

@interface ClassName()
{
@private
    NSArray* private;
}
@property (strong, nonatomic) NSArray* public;
@end

现在这就是我感到困惑的地方。该属性被声明为(strong, nonatomic),但私有变量没有任何类型。那么 arc 是如何知道它是否强大的呢?

【问题讨论】:

  • 仅供参考 - 您发布的代码是旧的做事方式。私有 ivars 现在属于 .m 文件中的 @implementation 块。此外,无需为属性声明 ivars。并且不需要明确的@synthesize 调用。只需在 .h 中声明 @property 即可。编译器会自动合成一个 ivar。

标签: iphone objective-c xcode automatic-ref-counting private-members


【解决方案1】:

实例变量默认为__strong

来自Apple's ARC Transition Guide,关于变量(假定包括实例变量):

__strong 是默认值

及以后:

使用 ARC,默认情况下实例变量是强引用 - 将对象直接分配给实例变量确实会延长对象的生命周期

在属性通过@synthesize 连接到 ivar 之前,这一直有效。此时,属性的所有权限定符优先。但是,如果您将属性声明为非强属性,然后手动实现 setter 和 getter,您还必须手动声明支持 ivar 的所有权限定符。

【讨论】:

    【解决方案2】:

    在属性的情况下,关联实例变量的所有权隐含在该属性的所有权中:

    http://clang.llvm.org/docs/AutomaticReferenceCounting.html:

    如果一个属性是合成的,那么关联的实例变量是 可能隐含地命名的实例变量 @synthesize 声明。如果关联的实例变量已经 存在,则其所有权资格必须等于 该物业;否则,实例变量是用它创建的 所有权资格。

    一般来说,Objective-C 对象默认是强的:

    如果一个对象被声明为具有可保留的对象所有者类型,但是 没有明确的所有权限定符,它的类型是隐式的 调整为具有 __strong 资格。

    请注意,由于 LLVM 4.0 编译器(Xcode 4.4),@synthesize 语句和关联的实例变量是自动创建的,因此您只需声明属性即可。

    【讨论】:

      【解决方案3】:

      @property 上的限定符指定综合设置器和其他 ARC 插入代码的行为。变量本身并不是很强大,它们只是内存位置。所以你现在已经把它编码得很好了。

      使其私有(且强)的方法是在 .m 文件中的类别中声明它为强。

      // .h
      // nothing
      
      // .m
      @interface ClassName()
      @property (strong, nonatomic) NSArray* myStrongPrivateProperty;
      @end
      
      // that's it
      

      【讨论】:

      • “变量本身并不强大,它们只是内存位置。” - 这是错误的。所有 Objective-C 对象都有一个所有权,默认情况下是 __strong。
      • 这是比喻性的。该引用陈述了关于如何处理这些内存位置的约定。实例变量最终是结构中的字节,它们没有存储额外的位来解释在运行时应该如何处理它们。那是一个编译器表。
      • 这有点像说“实例变量没有类型,它们只是结构中的位。”变量由位表示这一事实并没有改变语义上它还具有其他属性的事实。变量可以是 __strong 或 _weak,无论 @property 是否存在。
      • +1 表示正确的观点和良好的类比。这些事情是由约定决定的(就像我们可以编造一个说未修饰的 4 个字节应被视为整数一样)。我对 OP 问题的阅读是从哪里来的 ARC 语义?无论您是否明确声明了结构,它们都来自@property 声明。
      • +1 说明如何正确声明私有属性。
      猜你喜欢
      • 1970-01-01
      • 2013-11-27
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      • 2012-05-06
      • 2014-01-02
      • 2012-11-12
      • 1970-01-01
      相关资源
      最近更新 更多