#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)