Objective c 如果我在从代理访问视图时获得EXC_BAD_访问权限,这是否意味着我有内存泄漏?

Objective c 如果我在从代理访问视图时获得EXC_BAD_访问权限,这是否意味着我有内存泄漏?,objective-c,ios,Objective C,Ios,我有一个我喜欢的对象: 因此,我的视图被传递给pdtd对象。此时,我可以毫无问题地注销我的视图。当我在文本字段内单击,滚动视图被告知要重新定位时,会出现错误。在我的table delegate(pdtd)上,我得到了一个错误,该错误在函数的第一行给出了“EXC_BAD_ACCESS”: - (void)keyboardDidShow:(NSNotification *)notif { [self.scrollView setContentOffset:CGPointMake(0, 100

我有一个我喜欢的对象:

因此,我的
视图
被传递给
pdtd
对象。此时,我可以毫无问题地注销我的视图。当我在文本字段内单击,滚动视图被告知要重新定位时,会出现错误。在我的table delegate(pdtd)上,我得到了一个错误,该错误在函数的第一行给出了“EXC_BAD_ACCESS”:

- (void)keyboardDidShow:(NSNotification *)notif {
    [self.scrollView setContentOffset:CGPointMake(0, 100) animated:YES]; // <-- ERROR SHOWS UP HERE

    [self.scrollView setContentSize:CGSizeMake([self.scrollView frame].size.width, 
                                               [self.scrollView frame].size.height + 100)];
}
ProfileDateTableDelegate.h
我不确定如何获取堆栈跟踪信息(Xcode 4.2)。此外,在analyze上有几个警告,但并不严重(如蓝色)

啊,可怕的
EXC\u坏访问
。不必通读所有的代码,这里有一个技巧可以让你马上开始。运行分析器。然后,在仪器中使用泄漏工具

有关详细信息,以及有关导致这些错误的原因和如何修复的分步说明的优秀链接,请查看以下问题的答案:


啊,可怕的
EXC\u坏访问
。不必通读所有的代码,这里有一个技巧可以让你马上开始。运行分析器。然后,在仪器中使用泄漏工具

有关详细信息,以及有关导致这些错误的原因和如何修复的分步说明的优秀链接,请查看以下问题的答案:


您需要在
initWithTableView:
ProfileDateTableDelegate.m中调用
self.scrollView=view
scrollView=[view retain]
方法

基本上,在您能够访问scrollView之前,您的scrollView会在其他视图中被释放,因为您的“委托”类不会以任何方式保留它,即使您已经在属性上指定了
非原子的retain
。由于您直接在
init
中设置ivar,而不是使用setter属性,因此不会对其调用retain。直接使用ivar时,如果希望保留,必须自己调用
retain

避免此错误的一种方法是在ivar之前或之后使用下划线
(Apple使用before,所以我使用after来避免私有ivar冲突),如下所示:

在h中:

@interface{
    UIScrollView *scrollView_;
}

@property (nonatomic,retain) UIScrollView *scrollView;
在*.m中:

@synthesize scrollView = scrollView_;
然后,在
init
中,您可以像这样保留进入的视图:

scrollView_ = [view retain];
只需确保在
dealloc
中正确释放它即可:

- (void)dealloc{
    [scrollView_ release], scrollView_ = nil;
    [super dealloc];
}

您可以找到有关这一切的更多信息。

您需要在
ProfileDateTableDelegate.m
中的
initWithTableView:
方法中调用
self.scrollView=view
scrollView=[view retain]

基本上,在您能够访问scrollView之前,您的scrollView会在其他视图中被释放,因为您的“委托”类不会以任何方式保留它,即使您已经在属性上指定了
非原子的retain
。由于您直接在
init
中设置ivar,而不是使用setter属性,因此不会对其调用retain。直接使用ivar时,如果希望保留,必须自己调用
retain

避免此错误的一种方法是在ivar之前或之后使用下划线
(Apple使用before,所以我使用after来避免私有ivar冲突),如下所示:

在h中:

@interface{
    UIScrollView *scrollView_;
}

@property (nonatomic,retain) UIScrollView *scrollView;
在*.m中:

@synthesize scrollView = scrollView_;
然后,在
init
中,您可以像这样保留进入的视图:

scrollView_ = [view retain];
只需确保在
dealloc
中正确释放它即可:

- (void)dealloc{
    [scrollView_ release], scrollView_ = nil;
    [super dealloc];
}
你可以找到更多关于这一切的信息

- (void)dealloc{
    [scrollView_ release], scrollView_ = nil;
    [super dealloc];
}