2014-09-10 2 views
0

Я пытаюсь добавить объект к NSMutableArray с кодом, как это:NSMutableArray и ARC

Item *newItem = [[Item alloc] init]; 
[self.theArray addObject:newItem]; 

Если я правильно помню, в старые сохраняющих дней/релиз не придется беспокоиться о переменная newItem выходит из области видимости, потому что объект получит retain, когда он будет добавлен в массив, и поэтому не будет освобожден.

Но я использую ARC сейчас, и объект исчезает. Сам массив отлично, и другие объекты, которые он содержит, не затрагиваются. Поэтому я подозреваю, что мой newItem автоматически освобождается по какой-либо причине.

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

+0

Массив не может содержать объекты «nil». Является ли объект в массиве после того, как вы вызвали 'addObject:'? – Tommy

+0

Да, я вижу это в окне отладки в Xcode. Все его атрибуты (NSStrings) также не повреждены. – DKJ

ответ

1
Item *newItem = [[Item alloc] init]; 

// This line is the same as this 
// 
// __strong Item *newItem = [[Item alloc] init]; 
// 
// the newItem variable has strong reference of the Item object. 
// So the reference count of the Item object is 1. 

[self.theArray addObject:newItem]; 

// Now theArray has strong reference of the Item object. 
// So the reference count of the Item object is 2. 

Счетчик ссылок объекта Item равен 2, поэтому объект Item не будет выпущен. Если у вашего кода был такой вид, как:

{ 
    Item *newItem = [[Item alloc] init]; 
    [self.theArray addObject:newItem]; 
} 

Это не влияет на объект Item.

{ 
    Item *newItem = [[Item alloc] init]; 
    [self.theArray addObject:newItem]; 
    // the reference count of the Item object is 2 as I said. 
} 
// The scope of the newItem variable was ended. 
// So the lifetime of the newItem variable was ended, 
// then the strong reference by the newItem was gone. 
// Thus the reference count of the Item object was reduced from 2 to 1. 

Счетчик ссылок объекта Item равен 1, поэтому объект Item также не будет выпущен.

+0

Я обнаружил, что объект 'newItem' не освобождается: он просто удаляется из массива. Я понятия не имею, почему это происходит. Я прошел через код, и в этом массиве не выполняется метод 'removeLastObject'. – DKJ

+1

Существует множество способов удалить или заменить элемент из NSMutableArray, кроме removeLastObject. –

0

Я наконец выяснил, что случилось. Это не имело никакого отношения к распределению. Случилось так, что метод awakeFromNib вызывался снова при перезагрузке табличного представления. Конечно, это переустанавливает всевозможные вещи, заставляя вещи исчезать.