slicePointsIn01
устанавливается для двух разных объектов: один в initInstance
, а затем еще один позже в initWithFrame:
.
Поскольку первый из них был установлен на alloc
'd объект,тогда этот объект никогда не был release
до того, как вы изменили назначение, исходный объект утек.
Если вы добавляете свойство, вам нужно убедиться, что вы действительно используете его, а не используете переменную экземпляра.непосредственно.Это можно сделать, выполнив присваивания одним из следующих двух способов:
self.myProperty = //something;
[self setMyProperty: //something];
Примечание (спасибо @ Андре): убедитесь, что объект something
имеет счет 0 при назначении (т. Е. Автоматически освобожден,как правило), потому что собственность сохраняет это для вас.
//NOT like this:
myProperty = //something;
Эта строка напрямую использует переменную экземпляра.Это приводит к вашей утечке, потому что без использования свойства счетчик ссылок на указанный объект не изменяется.
Редактировать: Вы никогда не должны проверять счет сохранения.Просто следуйте правилам в каждом месте, где вы используете объект, и все будет в порядке. Вот правила:
Вы владеете любым создаваемым вами объектом, выделяя для него память или копируя его, то есть с помощью методов alloc
, allocWithZone:
,copy
, copyWithZone:
, mutableCopy
, mutableCopyWithZone:
Если вы не являетесь создателем объекта, но хотите убедиться, что он остается в памяти для использования,Вы можете выразить право собственности на него, позвонив по номеру retain
Если вы владеете объектом, либо создавая его, либо выражая долю владения, вы несете ответственность за его освобождение, если нетбольше не нужно, позвонив по номеру release
или autorelease
И наоборот, если вы не являетесь создателем объекта и не выразили право собственности, вы не должны его выпускать.
Если вы получаете объект из другого места в вашей программе, обычно гарантируется, что он останется действительным в методе или функции, в которой он был получен. Если вы хотите, чтобы он оставался действительным вне этой области, вы должны сохранить или скопировать его.Если вы попытаетесь освободить объект, который уже был освобожден, ваша программа вылетит.
Вам не нужно писать setMyProperty
.Когда вы @synthesize
свойство, этот метод создан для вас.