内存不良访问:有版本,协议和代理的问题

时间:2011-10-05 14:50:05

标签: iphone objective-c ios ipad

我对内存管理有一个小问题是iOS ...

我定义了一个拥有一个协议的视图。在其他类中,我创建了另一个类的实例,我将视图添加到其他视图然后,我尝试释放de实例。当我调用协议的方法时出现问题,因为我收到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并发出错误。有谁知道如何发布这个对象?

谢谢,

大卫

2 个答案:

答案 0 :(得分: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 :(得分:0)

您不必释放c1,而是必须保留它! addSubview 不保留c1实例,只保留其视图!如果您稍后参考c1,您将获得错误访问