何时在objective-c中的init方法中使用self.property,如何在init方法中初始化数组

时间:2012-02-14 17:18:18

标签: iphone

我对在内存管理,自定义子类和数组方面为自己的子类编写自定义init方法的正确方法感到困惑。如果我有以下属性:

@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSMutableArray *array;
@property (nonatomic, retain) SomeSubclassOfNSObject *object;

@interface SomeSubclassofNSObject 
@property (nonatomic, retain) NSString *category;

如何编写init方法?

你做了:

initWithName:(NSString *)aName object:(SomeSubclassOfNSObject *)anObject {
    if (self = [super init]) {
       self.name = aName; // or do you do name = aName or name = [aName copy] autorelease] or name = [NSString alloc] initWithFormat:@"%@", aName]
       self.object = anObject; // do I need to make a copy of this object so they don't point to the same object?

    // loop through NSMutableArray and copy the objects?
    // not really sure what to do for arrays.      
    }
    return self;
}

1 个答案:

答案 0 :(得分:0)

  1. 在大多数情况下,我建议使用self.name = aName;因为这会利用生成的setter,因此保留计数会隐式递增。这意味着无论init的来电者随后aName做什么,您的引用都是安全的。这同样适用于dealloc对应物:只需写self.name = nil;即可。

    如果您提供NSMutableString,情况会有所不同,因为类内部的更改会影响其他类对此的引用。但是从设计的角度来看,只有在你操纵它们的意图时才应该使用可变字符串作为参数。

  2. self.object = anObject;:这取决于你想要什么。如果所有类都指向同一个对象,则不要复制(我认为这通常是你想要的)。在某些情况下,制作深层副本是合理的。

  3. 数组:在init方法中需要array = [[NSMutableArray alloc] init];之类的东西。之后,对于您添加的每个对象,保留计数将自动递增,即您不得在添加的对象本身上调用retain。与2中一样,可能存在您确实希望拥有某些源数组的对象副本的情况。好的,但这种情况很少发生。

    更多的时候,你有一个现有的数组,并希望它的子数组或特殊的排序版本。所以你有一个新的数组但是相同的元素。

  4. 这是简短的回答。更多相关信息:

    Advanced Memory Management Programming Guide

    Declared Properties