Удаление и удаление UiButtons - PullRequest
1 голос
/ 05 июня 2011

Я пытаюсь создать программу, которая динамически создает кнопку, используя команду:

[UIButton buttonWithType:UIButtonTypeRoundedRect]

Но когда я использую эти команды, удалите созданную мной кнопку:

[currentButton removeFromSuperview];
[currentButton dealloc];
[currentButton release];

Я получаю ошибку.Как бы я мог удалить и освободить память из uibutton?

Ответы [ 4 ]

2 голосов
/ 05 июня 2011

Я получил эту проблему давным-давно, пожалуйста, обратите внимание, что

[UIButton buttonWithType:UIButtonTypeRoundedRect]

имеет авто-релиз внутри, поэтому при инициализации вам нужно сохранить, например:

_mybutton = [[UIButton buttonWithType:UIButtonTypeRoundedRect] retain];

и позже, вы можете сделать:

[_mybutton release];

Надежда помогает :)

0 голосов
/ 05 июня 2011

Вы не можете отменить UIButton, который вы получаете через buttonWithType из системы, если вы не выделили какой-либо экземпляр, то у вас нет права вызывать release по этому вопросу.

В вашем случае вы можете использовать removeFromSuperview, но не dealloc или release.

Вы не можете вызвать dealloc непосредственно для объекта, это вызывается системой, когда вы говорите release для объекта.

РЕДАКТИРОВАНИЕ:

Вы можете создать свою кнопку, используя initWithFrame функцию UIView. Но вы получите только тип кнопки UIButtonTypeCustom, который по умолчанию, и также не может не изменить тип кнопки, потому что это свойство readonly. Таким образом, вы получите закругленную кнопку, используя некоторые изображения.

0 голосов
/ 05 июня 2011

В инфраструктуре 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.

0 голосов
/ 05 июня 2011

Вы не должны звонить напрямую в dealloc. Попробуйте удалить строку dealloc и посмотрите, как это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...