Форум программистов, компьютерный форум CyberForum.ru

Objective-C

Войти
Регистрация
Восстановить пароль
 
Parmizan
0 / 0 / 0
Регистрация: 28.05.2012
Сообщений: 3
#1

Ошибка при удалении - Objective-C

28.05.2012, 21:26. Просмотров 807. Ответов 4
Метки нет (Все метки)

Собстенно сабж.
Файл viewController
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
- (void)viewDidLoad 
{
    [self initField];
    
    [super viewDidLoad];
}
 
- (void) initField
{
    for (int x = 0; x < KOL_FIELD_BUTTONS; x++)
        for (int y = 0; y < KOL_FIELD_BUTTONS; y++)
        {
            int type = 0;
            buttons[x][y] = [button new];
            buttons[x][y] = [buttons[x][y] init:type];
            
            CGRect newFrame = [buttons[x][y] getImage].frame;;
            float widthButton = 320.0f/KOL_FIELD_BUTTONS;
            newFrame.origin = CGPointMake(x * widthButton,y * widthButton);
            newFrame.size.width = widthButton;
            newFrame.size.height = widthButton;
            [buttons[x][y] setImageFrame:newFrame];
            [self.view addSubview:[buttons[x][y] getImage]];
        }
}
 
 
- (IBAction) newGame
{
    for (int x = 0; x < KOL_FIELD_BUTTONS; x++)
        for (int y = 0; y < KOL_FIELD_BUTTONS; y++)
            [buttons[x][y] dealloc];
    
    [self initField];
}
Файл button
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- (id) init : (int)typeButton 
{ 
    if (self = [super init]) 
    {
        type = typeButton;
        UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"%d.png",type]];
        imageView = [[[UIImageView alloc] initWithImage:image]
                        autorelease]; 
    }
    return self;
}
 
- (void) dealloc { 
    [imageView release]; 
    [super dealloc];
}

При вызове newGame происходит ошибка.
Подскажите пожалуйста, что не так делаю.
Заранее спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.05.2012, 21:26     Ошибка при удалении
Посмотрите здесь:

Objective-C Ошибка при инициализации адресной книги

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
XuTPbIu_MuHTAu
Эксперт C++
2221 / 736 / 10
Регистрация: 27.05.2008
Сообщений: 1,508
29.05.2012, 08:24     Ошибка при удалении #2
Очень много ошибок в коде.

1. Не стоит вызывать dealloc напрямую. Читай про управление памятью.
2. В ините кнопки:
Objective-C
1
2
imageView = [[[UIImageView alloc] initWithImage:image]
                        autorelease];
В деаллоке кнопки:
Objective-C
1
 [imageView release];
Итого 2 релиза на 1 ретейн.
3. Не вижу,кстати, чтобы imageView убирался из superview.
4. Странная логика. Зачем вообще нужен класс button, если он не работает как view? Чем, кстати UIButton не подошел?
5
Objective-C
1
2
         buttons[x][y] = [button new];
            buttons[x][y] = [buttons[x][y] init:type];
Переписать как
Objective-C
1
buttons[x][y] = [[button alloc] initWithType:type]
В твоем варианте init кнопки происходит дважды,тк new - это сокращенный вариант [[button alloc] init];


Еще советы :

6 Не используй транслит в коде ( я про вот это KOL_FIELD_BUTTONS )
7 Инициализацию кнопки следует переименовать из
Objective-C
1
- (id) init:(int) type
в
Objective-C
1
- (id) initWithType:(int) type
Так принято, легче читать oдинаково составленный код.
Parmizan
0 / 0 / 0
Регистрация: 28.05.2012
Сообщений: 3
29.05.2012, 18:59  [ТС]     Ошибка при удалении #3
Спасибо большое за ответ.

А логика у меня такая:
Я пишу настольную игру типа крестиков-ноликов.
Класс button это фишка или значок. Этот класс будет содержать только тип кнопки, ее картинку, а также методы анимации. Поэтому я подумал, что наследовать его от UIButton нет смысла.
Также будет класс field, состоящий из двумерного массива button, он будет отвечать за логическую составляющую (проверка победителя, смена игроков, ходы).
Ну и основной view будет считывать действия пользователя и отсылать классу field.

Я хотел бы задать еще один вопрос - можно ли как-то организовать в классе button метод типа:
основному view посылается сообщение: "нарисуй эту картинку там-то"?

P.S. здесь можно задавать несколько вопросов в одной теме или нужно каждый раз новую создавать?
zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
30.05.2012, 17:04     Ошибка при удалении #4
Цитата Сообщение от Parmizan Посмотреть сообщение
Я хотел бы задать еще один вопрос - можно ли как-то организовать в классе button метод типа:
основному view посылается сообщение: "нарисуй эту картинку там-то"?
Это не верно семантически. Кнопка не должна знать ничего о каких то картинках. На то она и кнопка.
Повесьте на кнопки actions, присвойте кнопкам теги(используйте enum), затем при вызове селектора проверяйте какой тэг у кнопки-сендера, исходя из этого "рисуйте" определенную картинку.
Parmizan
0 / 0 / 0
Регистрация: 28.05.2012
Сообщений: 3
03.06.2012, 22:56  [ТС]     Ошибка при удалении #5
zulkis, спасибо большое.

Теперь я столкнулся с такой проблемой:
при смене кнопки на другой тип, я старую кнопку удаляю и создаю новую с новым типом. Но при этом мне нужно чтобы старая кнопка плавно исчезла, т.е. удалилась с задержкой. Но новая кнопка уже должна начать появляться. Как сделать так, чтобы обе анимации происходили одновременно?
Правильная ли у меня логика, или надо было просто сделать метод изменения типа с последующей анимацией?

Заранее спасибо.
Yandex
Объявления
03.06.2012, 22:56     Ошибка при удалении
Ответ Создать тему
Опции темы

Текущее время: 05:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru