В инфраструктуре Objective-C / Cocoa вы сталкиваетесь с двумя различными способами получения объектов: тем, для которого у вас есть явное выделение памяти (через конструктор), и тем, на который вы получили ссылку на память (через метод класса).
FooBar *fone = [[FooBar alloc] initWithText:@"Hello, World!"];
В этом примере память явно выделяется для объекта вашим вызовом с использованием метода alloc, а затем она инициализируется данными, используя метод initWithText, который будет иметь заголовок метода, подобный этому:
- (id)initWithText:(NSString *)text;
С другой стороны, вы также столкнетесь с объектами, которые автоматически создаются для вас классами. Пример этого будет ниже:
FooBar *ftwo = [FooBar fooBarWithWelcomeText];
В этом примере объект FooBar возвращается, даже если мы не вызываем alloc для выделения памяти для него. Существует много разных причин для реализации такого метода, но в основном это делается для того, чтобы абстрагировать некоторые детали от кода, использующего объект. Приведенный выше пример будет иметь соответствующий заголовок метода, например:
+ (FooBar *)fooBarWithWelcomeText;
В зависимости от того, какой подход используется, он меняет способ взаимодействия с памятью объекта. Так, для первого примера, после выделения памяти для объекта, вы получите его обратно с счетом сохранения 1. Если вы закончили использовать объект, вам нужно явно освободить его с помощью
[fone release];
Во втором примере вы получаете объект с автоматическим освобождением , который будет освобожден после слива автозапуска. Если вы хотите сохранить его, вы должны явно указать:
[ftwo retain];
Если вы не хотите сохранять его, вы можете просто оставить его как есть, и он будет автоматически отменен. Вы можете сказать, что метод использует autorelease по двум характеристикам: 1) вы не будете использовать alloc при получении объекта; и 2) рядом с заголовком метода будет стоять знак «+». Это означает, что метод объявлен как метод класса (аналогично статическим методам Java).
Итак, чтобы, наконец, ответить на вашу конкретную ситуацию, вам нужно только убедиться, что количество сохраненных записей уменьшено до 1 (единственным объектом, имеющим ссылку на него, был пул авто-выпуска). В вашем примере это будет сделано так:
UIButton *currentButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[someView addSubView:currentButton];
// some code later
[currentButton removeFromSuperview];
Вам не нужны операторы release, потому что вы никогда не сохраняли их явно. Когда вы добавили UIButton в другое представление, он сохранил объект, поэтому он увеличил счетчик ссылок до 2. Удаляя его из представления, он понижается обратно до 1, так что при сбросе пула автоматического выпуска ваша UIButton будет освобождена. , Кстати, никогда не вызывайте метод dealloc напрямую. Когда количество сохраненных объектов уменьшается до 0, автоматически вызывается метод dealloc.