Во-первых, просто чтобы немного уточнить, что означает объявление свойства, я немного объясню.
Когда вы объявляете свойство, вы на самом деле объявляете два метода, метод get и метод set для этого конкретного атрибута класса.Когда вы объявляете свойство как retain
, вы фактически говорите, что когда вы устанавливаете это свойство с помощью метода setter, оно будет сохранено.В основном это означает, что его счетчик будет увеличен.
Чтобы установить атрибут класса с помощью объявленного свойства, вы можете использовать синтаксис точки, например, self.myProperty
, или метод установки, например, -(void)setMyProperty:(MyClass*)newMyClass
,
Итак, в вашем коде, даже если вы объявляете свойство, вы не используете его, потому что вы не используете ни один из методов, указанных выше.
Теперь,
MyClass *aux = [[MyClass alloc] init];
myProperty = aux;
[aux release];
- Вы выделяете объект
MyClass
, теперь этот объект имеет количество сохраненных единиц 1. - Вы назначаете его своему атрибуту класса (без использования свойства), чтобы сохранитьколичество равно 1.
- Вы освобождаете этот объект, так что его счет сохранения равен 0, и он освобождается.
myProperty = [[MyClass alloc] init];
- Вы выделяете
MyClass
объект (он имеет счетчик 1) и присвойте ему свой атрибут класса myProperty
.
Итак, чтобы подвести итог, в первом случае вы создаете объект в памяти, а затем выутилизируйте его, тогда как во втором вы создаете его, но он никогда не удаляется.