Выделение / освобождение памяти для NSString - PullRequest
1 голос
/ 09 июня 2011

У меня есть класс, который принимает протокол MKAnnotation. Наряду с двумя методами «title» и «subtitle», которые нужно реализовать, я хотел добавить две строки NSString, одну для представления каждой строки в типичном американском адресе. Например:

addressLine1 = 123 street
addressline2 = northridge, ca 91326

Мой метод субтитров в настоящее время выглядит так:

- (NSString *)subtitle {
    NSMutableString * ret = [NSMutableString stringWithCapacity:kDefaultStringCapacity];
    if (streetAddress) {
        [ret appendString:streetAddress];
        addressLine1 = [[NSString alloc] initWithFormat:streetAddress];
    }
    ... more code

Когда я выпущу addressLine1? Поскольку это свойство, которое я объявил (nonatomic, retain), я уже выпустил его в своем методе dealloc. Или я должен использовать метод класса или автоматически освободить строку? Спасибо.

Ответы [ 2 ]

3 голосов
/ 09 июня 2011

Если вы autorelease address1, вы потеряете право собственности на объект, а без каких-либо других владельцев он будет освобожден.Вам нужно было бы autorelease, если бы вы это делали,

self.address1 = [[NSString alloc] initWithString:streetAddress];

, что неправильно, поскольку вы бы дважды вступили во владение и отказались бы от него только один раз в методе dealloc.Правильный путь был бы,

self.address1 = [[[NSString alloc] initWithString:streetAddress] autorelease];

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

Еще одна вещь, связанная со строками, заключается в том, что вы будете копировать их, так как не хотите, чтобы они мутировали после назначения, таксвойство должно быть объявлено как @property (nonatomic, copy), а не как сейчас.

2 голосов
/ 09 июня 2011

Если ваше свойство (nonatomic, retain), то вы потеряете ресурс addressLine1, если явно не release. Я выпущу его, как только вы закончите с этим. Затем свойство должно быть освобождено в вашем методе dealloc, как вы делаете в настоящее время.

В некоторой степени не связан с вопросом, но все еще связан с тем, что всякий раз, когда у вас есть объект, реализующий протокол NSCopying, например, в данном случае NSString, вы должны использовать copy вместо retain. Вот SO вопрос , который предоставляет отличную информацию.

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