所以搜索Stack Overflow这似乎就是如何在Objective-C中创建私有变量:
@interface ClassName()
{
@private
NSArray* private;
}
@property (strong, nonatomic) NSArray* public;
@end
现在这是我感到困惑的地方。该属性声明为(strong, nonatomic)
,但私有变量没有任何类型。那么弧怎么知道它是否强大?
答案 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