I’m not sure I’m going to answer your question correctly, because I have a feeling I’m not understanding you fully. So please ask questions if I didn’t understand, but let me give it a shot.
When you call the +randomItem method, a new BNRItem is created on the heap and we have one pointer to this BNRItem, which is the item local variable. At this point, the BNRItem has one owner.
On the next line of code, we add that BNRItem to the privateItems array. Since arrays own their objects, the BNRItem now has two owners: one from the item local variable and another from the privateItems array.
The thing to remember is, item is a local variable, so when we return from the createItem method, the local variable goes out of scope, and so one owner to the BNRItem is lost. At this point, the only reference we have to the BNRItem is through the privateItems array.
We aren’t recreating anything in the removeItem: method. A pointer to some item (aka a memory address) is passed in, and the privateItems array removed the BNRItem with the same memory address from itself. As mentioned in the previous paragraph, since the privateItems array is the only object that is an owner on the BNRItem, when it is removed from the array, its ownership count decrements from 1 to 0, and so the BNRItem will get destroyed.
Let me know if that helps.