Назначение локальной переменной в сравнении с прямым назначением; свойства и память - PullRequest
2 голосов
/ 18 июня 2010

В target-c я вижу много примеров кода, где автор назначает локальную переменную, присваивает ее свойству, а затем освобождает локальную переменную.Есть ли практическая причина для этого?Я просто присваивал недвижимость большей частью.Будет ли это вызвать утечку памяти в любом случае?Я думаю, я хотел бы знать, есть ли какая-либо разница между этим:

HomeScreenBtns *localHomeScreenBtns = [[HomeScreenBtns alloc] init];
self.homeScreenBtns = localHomeScreenBtns;
[localHomeScreenBtns release];

и этим:

self.homeScreenBtns = [[HomeScreenBtns alloc] init];

Предполагая, что homeScreenBtns - это свойство, подобное этому:

@property (nonatomic, retain) HomeScreenBtns *homeScreenBtns;

Я собираюсь отправить свое приложение в магазин приложений, поэтому я нахожусь в режиме полной оптимизации / QA.

Ответы [ 3 ]

5 голосов
/ 18 июня 2010

Предполагается:

@property (nonatomic,retain) HomeScreenBtns *homeScreenBtns;
  1. HomeScreenBtns * localHomeScreenBtns = [[HomeScreenBtns alloc] init];
  2. self.homeScreenBtns = localHomeScreenBtns;
  3. [localHomeScreenBtns release];

Тогда (1) означает retain.(2) подразумевает вторую retain, потому что свойство так говорит.(3) освобождает retain в локальной области видимости, созданной (1).

Если вы не сделаете (3), вы в конечном итоге утечете.

Все это задокументированов руководстве по управлению памятью.

2 голосов
/ 18 июня 2010

Вы не можете сделать это:

self.homeScreenBtns = [[HomeScreenBtns alloc] init];

потому что когда вы [[HomeScreenBtns alloc] init] создаете объект с alloc, у этого объекта есть счетчик сохранения 1. Затем, когда вы устанавливаете этот объект в homeScreenBtns, он имеет счет сохранения 2, потому что homeScreenBtns также сохраняет этот объект , Таким образом, счетчик сохранения объекта никогда не может вернуться к 0, потому что единственный оператор release находится в методе setter homeScreenBtns. Таким образом, вы теряете память. Если вы хотите сделать это в одном утверждении вместо первого, как вы перечислили, вы можете использовать:

self.homeScreenBtns = [[[HomeScreenBtns alloc] init] autorelease];
1 голос
/ 18 июня 2010

Как говорится в руководствах по управлению памятью - если вы создаете экземпляр чего-либо, вы должны управлять им и освобождать его.

 ...allocate]init];

Создает экземпляр.Независимо от того, что вы делаете с ним в своем коде, у вас должен быть соответствующий «... release]», иначе вы вызовете утечку памяти.

Если, как вы говорите, вы пишете код, который выделяет экземпляркласса и устанавливает свойство в той же строке, вы будете иметь УТЕЧКУ ПАМЯТИ ... И ваша программа потерпит крах ... После первого ... Замедление ... Вниз ................ пока ..... Использование ........ вверх ............ памятка .............

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