Objective-C中的私有变量是否强大?

时间:2013-03-24 16:39:40

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

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

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

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

3 个答案:

答案 0 :(得分:13)

默认情况下,实例变量为__strong

Apple's ARC Transition Guide开始,关于变量(假设包含实例变量):

  

__ strong是默认

以后:

  

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

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

答案 1 :(得分:8)

对于属性,属性的所有权隐含了相关实例变量的所有权:

请参阅http://clang.llvm.org/docs/AutomaticReferenceCounting.html

  

如果合成属性,则关联的实例变量为   实例变量,可能由隐式命名   @synthesize声明。如果关联的实例变量已经存在   存在,那么它的所有权资格必须等于所有权   财产;否则,使用该变量创建实例变量   所有权资格。

通常,Objective-C对象默认为strong:

  

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

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

答案 2 :(得分:3)

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

将其设置为私有(和强大)的方法是在.m文件中的类别中声明它。

// .h
// nothing

// .m
@interface ClassName()
@property (strong, nonatomic) NSArray* myStrongPrivateProperty;
@end

// that's it