7

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

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

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

4

3 回答 3

13

实例变量是__strong默认的。

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

__strong 是默认值

然后:

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

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

于 2013-03-24T16:52:23.163 回答
9

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

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

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

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

如果一个对象声明为具有可保留对象所有者类型,但没有显式所有权限定符,则其类型被隐式调整为具有 __strong 限定符。

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

于 2013-03-24T16:54:24.157 回答
3

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

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

// .h
// nothing

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

// that's it
于 2013-03-24T16:44:58.263 回答