когда использовать self.property в методах init в target-c, как инициализировать массивы в методах init - PullRequest
2 голосов
/ 14 февраля 2012

Я запутался в том, как правильно написать собственные методы init для вашего собственного подкласса с точки зрения управления памятью, пользовательских подклассов и массивов. Если у меня есть свойства, такие как:

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

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

Как мне написать мой метод инициализации?

Вы делаете:

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 голосов
/ 15 февраля 2012
  1. Я бы порекомендовал self.name = aName; в большинстве случаев, потому что это использует преимущества созданного установщика и, таким образом, счетчик сохранения неявно увеличивается.Это означает, что ваша ссылка безопасна вне зависимости от того, что будет делать потом вызывающий init с aName.То же самое относится и к аналогу dealloc: просто напишите self.name = nil; и все готово.

    Если вы поставите NSMutableString, все будет иначе, потому что изменения внутри вашего класса повлияют на ссылки других классов на это.Но с точки зрения дизайна изменяемые строки следует использовать в качестве параметров, только если вы намерены ими манипулировать.

  2. self.object = anObject;: Ну, это зависит от того, что вы хотите.Если все классы должны указывать на один и тот же объект, не копируйте (я думаю, это чаще всего именно то, что вы хотите).Могут быть случаи, когда разумно сделать глубокую копию.

  3. Массивы: вам нужно что-то вроде array = [[NSMutableArray alloc] init]; в вашем методе init.После этого счетчик хранения будет автоматически увеличиваться для каждого добавляемого вами объекта, т.е. вы не должны вызывать сохранение для самого добавленного объекта.Как и в 2. могут быть ситуации, когда вы действительно хотите иметь копии объектов некоторого исходного массива.Хорошо, сделайте это, но это редко.

    Чаще всего у вас есть существующий массив и вам нужен его под-массив или специальная отсортированная версия.Итак, у вас есть новый массив, но те же элементы.

Это был короткий ответ.Подробнее об этом:

Расширенное руководство по программированию управления памятью

Объявленные свойства

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...