Управление памятью - избыточные копии - PullRequest
2 голосов
/ 02 января 2012

Есть ли разница между:

@synthesize something;
…
NSObject *tempThing = [[NSObject alloc] init];
self.something = tempThing;
[tempThing release];

и

@synthesize something;
…
self.something =  [[NSObject alloc] init];

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

Ответы [ 3 ]

2 голосов
/ 02 января 2012

Если заявленная собственность сохраняется, например,

@property (nonatomic, retain) id something;

тогда при звонке

self.something = newValue;

// OR (the two are equivalent)

[self setSomething:newValue];

реализация сеттера сохранит значение newValue.

1010 * Поэтому *

   retain +1             retain +1
       |                     |
+------------+    +---------------------+
|            |    |                     |
self.something =  [[NSObject alloc] init];

Если вы release ивар something в dealloc, тогда у вас все еще будет удержание +1, которое вы не освободите.

Чтобы исправить это, используйте ваш первый метод (который предпочтительнее) или добавьте autorelease

self.something =  [[[NSObject alloc] init] autorelease];

Так зачем использовать первый метод? / Почему вы видите это в примерах?

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

0 голосов
/ 02 января 2012

Два примера кода определенно отличаются, но их реальное поведение зависит от объявления вашей собственности.

  1. Если свойство something имеет атрибут assign, то в верхнем примере первый NSObject оставляется с нулевым счетом сохранения, а нижний - с чистым счетом хранения 1.
  2. Если свойство something имеет атрибут retain: top = число 1 в первом NSObject, bottom = количество 2 в первом NSObject
  3. Если свойство something имеет copy атрибут: top = количество 0 в первом NSObject + количество 1 во втором NSObject (поскольку копия выделяет второй экземпляр!), bottom = число 1 в первом NSObject ( Первый NSObject также LEAKED! ), + количество 1 во втором NSObject.

Вот ваши примеры с некоторыми комментариями, чтобы объяснить лучше:

@synthesize something;
…
NSObject *tempThing = [[NSObject alloc] init]; //1st NSObject: +1 retain count
self.something = tempThing;     //1st NSObject: +0 if assign or copy, +1 if retain
                                //2nd NSObject: +1 if copy
[tempThing release];            //1st NSObject: -1 retain count

-

@synthesize something;
…
self.something =  [[NSObject alloc] init]; //2nd NSObject: +1 if copy
                               //1st NSObject: +1 if assign or copy, +2 if retain

Подробнее оатрибуты недвижимости здесь: http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html

0 голосов
/ 02 января 2012

Ответ зависит от свойства something;
, если оно равно retain, первый подход правильный, а во второй версии вы сохраняете something дважды.Следовательно, второй подход должен быть
something = [NSObject alloc] init];

, если это assign, первый подход не сохранит something, следовательно, он должен быть
self.something = [tempThing retain];

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