0

我知道在类的方法中分配值的正确约定是不使用 setter 版本。

鉴于您有这样的 init 方法:

// Class header 
@property (nonatomic, weak) id <DelegateType> delegate;
@property (nonatomic, strong) NSString *stringData;

@synthesize delegate = _delegate;
@synthesize stringData = _stringData;

- (id)initWithParams:(NSString *)aString delegate:(id<DelegateType>)aDelegate
{
    // initialization happens here
}

在 ARC 之前,您将通过以下方式确保正确的保留政策:

stringData = [aString retain];
self.delegate = aDelegate;

使用 ARC,如何完成作业并确保不会过早发布 ivars?

因为你不知道在 setter 覆盖的情况下可能在幕后发生什么样的工作,所以我的印象是你不能做:

self.stringData = aString

什么是正确的初始化模式?

4

3 回答 3

1

由于您使用属性作为

// Class header 
@property (nonatomic, weak) id <DelegateType> delegate;
@property (nonatomic, strong) NSString *stringData;

@synthesize delegate = _delegate;
@synthesize stringData = _stringData;

因此,根据 ARC,对象的工作方式类似于assign。但是“强”基本上不像保留那样工作,因为保留只会增加引用计数,而使用ARC,强类型的对象肯定存在,直到该类的实例存在。

所以在init方法中

它应该是

- (id)initWithParams:(NSString *)aString delegate:(id<DelegateType>)aDelegate
{
// now _stringData and _delegate are getter instance of property variables. so either you can use self.stringData and self.delegate or _stringData and _delegate.
    _stringData = aString;
    _delegate = aDelegate;
}
于 2012-08-17T18:13:22.843 回答
0

您可以,而且实际上您应该(在大多数情况下)使用访问器来访问您的 ivars,即使在您使用 ARC 的实现中也是如此。它比你想象的更聪明。不会有“过早”发布的 ivars。

于 2012-08-17T17:35:36.353 回答
0

只需分配给 ivar。ARC 将根据变量的内存管理策略(或)处理保留__strong__weak释放__unsafe_unretained。这就是 ARC 的意义所在。因此,您的代码示例将是:

- (id)initWithParams:(NSString *)aString delegate:(id<DelegateType>)aDelegate
{
    stringData = aString;
    delegate = aDelegate;
}

不过,顺便说一句,您可能应该复制该字符串而不是保留。因此,您将 setter 声明为@property (nonatomic, copy) NSString *stringData;,init 方法的实现将是:

- (id)initWithParams:(NSString *)aString delegate:(id<DelegateType>)aDelegate
{
    stringData = [aString copy];
    delegate = aDelegate;
}
于 2012-08-17T17:37:25.827 回答