Я прочитал несколько постов по этому вопросу, но есть еще одна вещь, которая мне не ясна.Я знаю, что это может быть довольно сложный вопрос, но на самом деле я довольно далеко продвинулся в разработке, не понимая этой фундаментальной проблемы.Я предполагаю, что это симптом самообучения.
Вы объявляете переменную в своем заголовке, например, так:
@interface SomeClass : NSObject {
NSMutableArray *anArray;
}
@property (nonatomic, retain) NSMutableArray *anArray;
end
А затем в своем основном файле вы синтезируете его и устанавливаете его в начальное значение:
@implementation SomeClass
@synthesize anArray
- (SomeClass *)init{
if (self = [super init]) {
self.anArray = [[NSMutableArray alloc] initWithCapacity:10];
}
[return self];
И отпустите его, когда ваш класс освободит:
- (void)dealloc {
[anArray release];
[super dealloc];
}
Теперь, когда я запускаю инструменты, строка
self.anArray = [[NSMutableArray alloc] initWithCapacity:10];
определяется как утечка памяти.Это утечка памяти, потому что когда вы определяете переменную anArray в заголовке, она выделяет память?(Потому что я думал, что это нулевой указатель.) Поэтому, когда вы хотите инициализировать его и вызываете [[NSMutableArray alloc] initWithCapacity: 10], вы перераспределяете память и теряете указатель на исходное распределение?
Поэтому вместо этого я использую метод класса удобства:
@implementation SomeClass
@synthesize anArray
- (SomeClass *)init{
if (self = [super init]) {
self.anArray = [NSMutableArray arrayWithCapacity:10];
}
[return self];
Это больше не идентифицируется как утечка памяти в инструментах.А поскольку это удобный метод, anArray автоматически освобождается.Тем не менее, если я предполагаю, что объявление экземпляра в заголовке выделяет память, что объясняет предыдущую проблему, то должен ли я по-прежнему выпускать массив?Сохраняет ли установка начальных значений таким образом, возможно, это?
Я понимаю разницу между
NSMutableArray *anArray = [[NSMutableArray alloc] initWithCapacity:10];
и
NSMutableArray *anArray = [NSMutableArray arrayWithCapactiy:10];
, но я не уверен, чтоВы понимаете, когда вы объявили NSMutableArray * anArray в своем заголовке, какой из двух подходов вы должны использовать и почему.И независимо от того, используете ли вы второй подход или нет, вы все равно должны освобождать anArray при вызове dealloc.
Могу добавить, что я нашел полезными следующие посты / ссылки: