При добавлении объекта в массив его счет сохранения будет увеличен. Объект будет освобожден, когда его счетчик сохранений будет равен 0. Поэтому при добавлении NSString к вам anArray он не будет копией (вы можете изменить foo, и он будет изменен также в массиве), но это увеличит счет сохранения foo на 1.
NSString *foo = [[NSString alloc] initWithString@"bar"]; // retain count +1
[anArray addObject:foo]; // NOT COPIED, but retain count of 'foo' increased by 1
[foo release]; // retain count of foo decreased by 1
Когда вы в какой-то момент времени выпускаете anArray, он будет вызывать release для своих объектов. Таким образом, число сохраненных foo, наконец, станет 0, и foo будет освобожден.
// some time later..
[anArray release]; // anArray released, foo retain count = 0.. foo gets released.
С уважением,
Christian