所以搜索 Stack Overflow 这似乎是如何在 Objective-C 中创建私有变量:
@interface ClassName()
{
@private
NSArray* private;
}
@property (strong, nonatomic) NSArray* public;
@end
现在这就是我感到困惑的地方。该属性被声明为(strong, nonatomic)
,但私有变量没有任何类型。那么 arc 是如何知道它是否强大的呢?
所以搜索 Stack Overflow 这似乎是如何在 Objective-C 中创建私有变量:
@interface ClassName()
{
@private
NSArray* private;
}
@property (strong, nonatomic) NSArray* public;
@end
现在这就是我感到困惑的地方。该属性被声明为(strong, nonatomic)
,但私有变量没有任何类型。那么 arc 是如何知道它是否强大的呢?
实例变量是__strong
默认的。
来自Apple 的 ARC Transition Guide,关于变量(假定包括实例变量):
__strong 是默认值
然后:
使用 ARC,实例变量默认是强引用——直接将对象分配给实例变量确实会延长对象的生命周期
这一直有效,直到该属性通过 连接到 ivar @synthesize
。此时,属性的所有权限定符优先。但是,如果您将一个属性声明为非强属性,然后手动实现 setter 和 getter,您还必须手动声明支持 ivar 的所有权限定符。
在属性的情况下,关联实例变量的所有权隐含在属性的所有权中:
请参阅http://clang.llvm.org/docs/AutomaticReferenceCounting.html:
如果一个属性是合成的,那么关联的实例变量是由@synthesize 声明可能隐含地命名的实例变量。如果关联的实例变量已经存在,则其所有权资格必须等于属性的所有权;否则,将使用该所有权资格创建实例变量。
一般来说,Objective-C 对象默认是强的:
如果一个对象声明为具有可保留对象所有者类型,但没有显式所有权限定符,则其类型被隐式调整为具有 __strong 限定符。
请注意,由于 LLVM 4.0 编译器(Xcode 4.4),@synthesize
语句和关联的实例变量是自动创建的,因此您只需要声明属性。
限定符@property
指定了综合设置器和其他 ARC 插入代码的行为。变量本身并不是很强大,它们只是内存位置。所以你现在已经把它编码得很好了。
使其私有(和强)的方法是在 .m 文件中的一个类别中声明它是强的。
// .h
// nothing
// .m
@interface ClassName()
@property (strong, nonatomic) NSArray* myStrongPrivateProperty;
@end
// that's it