2009-12-20 55 views
1

在iPhone的Objective-C世界性能,我已经随处可见这种模式,我用它自己所有的时间并没有真正理解正在发生的事情:“初始化”,这是保留

在Test.h

@interface Test: UIViewController 
{ 
    NSMutableArray *testArray; 
} 
@property (retain, nonatomic) NSMutableArray *testArray; 

而且在Test.m

@implementation Test 
@synthesize testArray 

- (void) viewDidLoad 
{ 

    // why do we do this? 
    NSMutableArray *init = [[NSMutableArray alloc] init]; 
    self.testArray = init; 
    [init release]; 

    [self.testArray addObject: @"A"]; // why can't I do this directly? 
    ... 
} 

- (void) dealloc 
{ 
    [testArray release]; 
    [super dealloc]; 
} 

我的问题是:如果testArray上有一个保留,当它在属性的声明,为什么我们需要创建一个新的NSMutableArray初始化对象,分配日在测试数组并释放?为什么我不能在viewDidLoad中开始使用testArray而不做其他任何事情?我知道有关这样做的最佳方式(创建一个新对象或使用autorelease对象)存在一些争议,但在这两种情况下,我们都以testArray的保留计数为1结束。我相信'保留'财产已经给了它。那么为什么需要创建这个init对象呢?

回答

7

'retain'属性不会自动创建一个NSMutableArray 。你相反,它只是表明,每当你分配东西的财产,它将会被保留

如果你的代码是这样的:

- (void) viewDidLoad 
{ 
    [self.testArray addObject: @"A"]; 
} 

然后self.testArray会nil,因此这将是必要的几乎没有任何操作。直到你给self.testArray指定了一些东西,它是空的。

这是发生了什么事。

- (void) viewDidLoad 
{ 
    // we need to assign an NSMutableArray to self.testArray. 

    NSMutableArray *init = [[NSMutableArray alloc] init]; 
    // The array has been retained once (by the call to |alloc|) 

    self.testArray = init; 
    // The array is assigned to a property with the 'retain' attribute 
    // Thus, the array has now been retained twice 

    [init release]; 
    // We release the array, so it now is retained once. 

    // We now have an array in self.testArray, so we can add something to it. 
    [self.testArray addObject: @"A"]; 
} 
+0

谢谢;现在有道理。 – 2009-12-20 22:00:18

1

@property指令中的“retain”指定setter应保留输入值而不是简单地复制该值。它与分配(预留内存)和初始化(构建对象)对象无关。保留在@property指令中,只是在调用setter时调用保留计数(这会让你去执行类似self.myobject =某些事情,而没有专门调用retain。)

相关问题