Что произойдет, если вы добавите только что созданный объект в изменяемый массив и освободите свой объект? - PullRequest
0 голосов
/ 15 апреля 2011

Что произойдет, если вы добавите только что созданный объект в изменяемый массив и освободите свой объект?

Ответы [ 3 ]

3 голосов
/ 15 апреля 2011

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

Object *obj = [[Object alloc] init];
[anArray addObject:obj];
[obj release];

С другой стороны, если вы владеете не владельцем объекта, то вы все еще не владеете им после добавления его вмассив, и все равно не должен освобождать его.Массив устанавливает свою собственную заявку на владение, но, как и ваш собственный код, он отвечает за балансировку своих собственных заявок.

Object *obj = [Object object];
[anArray addObject:obj];

// or, avoiding a temp variable

[anArray addObject:[Object object]];

Когда вы освобождаете массив или удаляете объект из массива (при условии, что этоизменяемый массив), массив выдаст свое собственное требование о владении.Вызывающий код не несет никакой дополнительной ответственности за это - массив подал заявку на владение, поэтому он отвечает за его освобождение, когда он завершен с объектом.

Другими словами, ваша ответственность за освобождение объекта или его отсутствие имеет ничего не имеет отношения к тому, добавили ли вы его в коллекцию.Ответственность массива также не имеет ничего общего с тем, что происходит вне массива.Это в основе инкапсуляции;каждый класс максимально изолирован от того, что происходит внутри других классов.Что происходит в NSVegas, остается в NSVegas.: -)

1 голос
/ 15 апреля 2011

Все нормально:

  NSMutableArray *array = [[NSMutableArray array] retain];
  Object *obj = [[Object alloc] init];
  [array addObject:obj];
  [obj release];

Я создал объект, используя alloc, init - так что я владелец объекта. Я добавил объект в массив и массив стал владельцем. Тогда я выпустил объект. Но у него все же есть владелец - массив.

Кстати: если вы освободите массив, объект будет освобожден автоматически.

0 голосов
/ 29 апреля 2011

Я бы выделил массив таким образом:

NSMutableArray *array = [[NSMutableArray alloc] init];
[array retain]

Object *obj = [[Object alloc] init]; //retain count = 1

Когда вы добавляете объект, счет удержания становится равным + 2

[array addObject:obj]; 

//When you release the retain count goes to 1 (object still exists)
[obj release];

Если вы освободите массив

[array release];

тогда количество объектов становится равным 0.

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