Причина, по которой вы можете освободить gc после его добавления в gastroCategoryList, заключается в том, что при добавлении объекта в массив массив сохраняет этот объект.Так что, даже если вы отпустите свой gc, он все равно будет;сохраняется посредством gastroCategoryList.
Когда вы возвращаете вновь созданный объект из метода, вам нужно вызвать autorelease.
Это приведет к тому, что объект будет освобожден только после того, как среда выполнения выйдет из области действия вызывающего метода,тем самым давая вызывающему методу шанс что-то сделать с возвращаемым значением.
Обратите внимание, что если ваш метод начинается со слова copy или new, то вы должны , а не автоматически высвобождать ваш объект;Вы должны оставить это для вызывающего метода для освобождения.
Что касается копирования vs retain vs assign ... как правило, копируйте объекты с изменяемой версией, такие как NSArray, NSSet, NSDictionary и NSString,Это гарантирует, что объект, на который у вас есть указатель, не будет изменяемым, если вы не хотите, чтобы он был.
В противном случае используйте retain всякий раз, когда вы хотите, чтобы ваш класс гарантировал, что объект все еще находится в памяти.Это будет применяться почти к каждому объекту, за исключением объектов, которые считаются родителями вашего объекта, и в этом случае вы бы использовали метод assign.(См. Раздел о циклах сохранения здесь ).
Также обратите внимание, что вы должны использовать assign для необъектных типов, таких как int.
Чтение через память Руководство по программированию управления немного;это очень полезно.