Проблемы с доступом к памяти: вопросы с выпусками, протоколами и делегатами

#iphone #objective-c #ios #ipad

#iPhone #objective-c #iOS #iPad

Вопрос:

У меня есть небольшой вопрос с управлением памятью в iOS…

Ну, я определяю собственное представление, в котором есть один протокол. В другом классе я создаю экземпляр другого класса, добавляю представление в другое представление, а затем пытаюсь освободить экземпляр. Проблема возникает при вызове метода протокола, потому что я получаю сообщение об ошибке BAD_ACCS. Это что-то вроде этого:

 - (void)viewDidLoad{
    Class1 *c1 = [[Class1 alloc]init];
    [c1 setDelegate:self];
    [self.view addSubview:c1.view];
    [c1 release];
}

- (void)methodOfProtocolClass1 {
    NSLog(@"c1 method called")
}
  

У Class1 есть одна кнопка, и когда я нажимаю ее, я вызываю methodOfProtoclClass1 и выдает ошибку. Кто-нибудь знает, как освободить этот объект?

Спасибо,

Дэвид

Ответ №1:

Вы переиздаете c1 здесь…

 - (void)viewDidLoad{
    Class1 *c1 = [[Class1 alloc]init]; //allocates Class1 instance with  1 ref count

    [c1 setDelegate:self];
    [self.view addSubview:c1.view];
    [c1 release]; //releases c1, ref count goes to 0 and the memory is reclaimed later
}
  

поэтому вы получаете плохой доступ, ваш экземпляр c1 исчез и недействителен к концу вашего метода viewDidLoad

Комментарии:

1. Спасибо за ответ. И я говорю то же самое, что и в предыдущем ответе. Если вы можете сделать это с помощью UIButton, почему бы не использовать собственный класс?

2. Вы добавляете туда представление c1s, а не c1, если вы создаете кнопку, которая является UIView, затем, когда вы добавляете ее, она сохраняется, здесь вы добавляете представление Class1s, которое сохраняет свое свойство view, но не Class1 Instnace

Ответ №2:

Вам не нужно выпускать c1, вместо этого вы должны сохранить его! addSubview не сохраняет экземпляр c1, он сохраняет только его представление! Если вы обратитесь к c1 позже, вы получите плохой доступ

Комментарии:

1. Да, я знаю, но если вы сделаете то же самое с одним UIButton, это сработает: вы можете выделить одну кнопку, затем добавить ее в свой вид, а затем отпустить. Почему не с собственным представлением? : S (Спасибо за ответ!)

2. потому что вы передаете не весь объект (c1), а его «часть» (c1.view)