Вы определили свою собственность с assign
семантикой памяти:
@property(nonatomic, assign) NSNumber* number;
Это означает, что вы получите ссылку на все, что вы предоставляете, но вы не будете сохранять сильную ссылку, и вы выиграли 't nil
ваша ссылка, когда объект освобожден. Это хуже обоих миров, потому что вы держите висячую ссылку на объект, который вы позволяете освободить. Как вы сказали, эта конкретная ошибка «может ... означать доступ к объекту, который был освобожден», и это именно то, что здесь происходит.
Вы можете рассмотреть возможность временного включения зомби ( команда + <</kbd>) или «Продукт» »« Схема »» «Редактировать схему ...» и go в разделе «Диагностика» настроек «Выполнить» и посмотрите, не изменится ли ваше поведение. Вероятно, вы больше не увидите эту ссылку NSIndexPath
(или что-то еще), а скорее получите некоторое подтверждение того, что экземпляр NSNumber
был освобожден.
В любом случае, вы, несомненно, хотели сделать это свойство NSNumber
strong
ссылка:
@property(nonatomic, strong) NSNumber *number;
Другим решением было бы сделать его weak
, что позволило бы его освободить, но безопасно установить вашу ссылку на nil
. Это безопаснее, чем assign
, но я также сомневаюсь, что это то, что вы хотели. И третьим вариантом будет copy
, который мы иногда используем с изменяемыми типами, который здесь неприменим.
Итог, в настоящее время, я бы посоветовал не использовать семантику памяти assign
с любыми типами объектов. Используйте strong
, copy
или weak
. В этом случае strong
- это то, что вы хотите. Используйте assign
только с примитивными типами данных (например, NSInteger
, CGFloat
, et c.), Но не с типами объектов.
И, помните, когда вы закончите тестирование с помощью зомби, выключи эту диагностику c.