Точечная нотация, релиз и Deloc - PullRequest
0 голосов
/ 16 мая 2011

@ interface:

UIImageView *myImageView;

@property (nonatomic, retain) UIImageView *myImageView;

@ реализация:

@synthesize myImageView;

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.myImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
}

Что такое счетчик ссылок для myImageView?2 (1 из alloc, 1 из точечной нотации сохраняются) или 3 (1 из alloc, 1 из точечной нотации сохраняются, 1 из @property retain)

Имеют ли эти два оператора одинаковый счетчик ссылок?

self.myImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];

и

myImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];

Кроме того, я предполагаю, что вы освобождаете их в @implemenation и в методе dealloc, правильно?


РЕДАКТИРОВАТЬ:

Я не получил ответ, который хотел, возможно, мой вопрос расплывчат.Я понимаю, что такое точечная нотация, @property, @synthesize и как работает метод setter и getter.Что я не понимаю, так это то, что происходит при использовании «я».и без "я".в отношении сохранения счета.Я фактически запустил метод retainCount на объекте myImageView, и он подтверждает мой оригинал, «себя».В случае case имеется счетчик сохранения «два» (с помощью alloc и свойства retain, поэтому, вероятно, рекомендуется использовать там autorelease).Теперь это приводит к другому вопросу, если бы я не использовал autorelease, как мне это сделать?Выпуск один раз в viewDidLoad и еще раз в dealloc все равно приведет к утечке памяти, верно?

self.myImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
NSLog(@"retain count dot: %d", [myImageView retainCount]);

2011-05-17 10: 01: 14.915 Тест [1249: 207] сохраняет счетчик точек: 2

myImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
NSLog(@"retain count: %d", [myImageView retainCount]);

2011-05-17 10: 03: 14.715 Тест [1278: 207] сохранить счет: 1

Ответы [ 3 ]

2 голосов
/ 16 мая 2011

Во-первых: вы не должны делать никаких предположений относительно количества ссылок. В лучшем случае это будет вводить в заблуждение.

Если вы используете свойство access (self.myImageView = ...), оно будет автоматически сохранено, поэтому вы пропускаете UIImageView в viewDidLoad. Вы должны использовать что-то вроде

self.myImageView = [[[UIMageView alloc] init.... ] autorelease];

Ваш последний пример (без доступа «точка») изменит ивар напрямую, поэтому он не пропустит этот новый экземпляр. НО будет утечка старого imageView, который вы переопределите, если вы не выпустите его раньше.

Я настоятельно рекомендую использовать доступ к собственности все время. И не забудьте убрать в dealloc:

[myImageView release], myImageView = nil;

Некоторые люди предпочитают self.myImageView = nil;, но это может иметь побочные эффекты.

1 голос
/ 16 мая 2011

нет, они не одинаковы.Первый действительно «сохраняет», таким образом увеличивая количество ссылок.Так что либо вы сначала назначаете его временной переменной, а затем освобождаете (в первом случае) [в качестве альтернативы, добавляете 'autorelease' и удаляете без временной переменной], или вы проверяете, что нет уже назначенного imageView (и если есть -отпустите его) во втором случае.

0 голосов
/ 16 мая 2011

Чтобы добавить к первому ответу, установщик точечных обозначений заботится об управлении памятью, связанном с освобождением старого объекта и сохранением нового. Во втором случае у вас будет огромная потенциальная утечка памяти, так как каждый раз, когда это вызывается, сохранение увеличивается на 1. Не в случае с установщиком точечной нотации.

Однако, поскольку он сохраняет объект, вам необходимо освободить исходное распределение.

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