为什么我不能保留UIView-Pointer?

时间:2010-06-22 17:34:59

标签: iphone uiview retain

我正在尝试将UIView传递给另一个类 - 这有点有用,但我无法保留指针......

在我的.h文件中我声明了视图:

UIView *someView;

我添加了属性

@property (nonatomic, retain) UIView *someView;

在.m文件中我合成了属性

@synthesize someView;

然后我有一个设置视图的方法(也在.h文件中设置 - 相信我:):

-(void)makeViewPointer:(UIView *)myView{
    someView = [[UIView alloc] init];
    someView = myView;

    for(UIView *aView in someView.subviews){

        NSLog(@"tag %d", aView.tag);

    }
}

到目前为止,一切正常。当我记录someView时,我得到一个指针,所有子视图都是可访问的。

我从另一个类调用此方法 - 这似乎工作正常。

现在 - 在点击按钮后,我设置了一个IBAction以对该视图执行某些操作

-(IBAction)doSomething:(id)sender{
    NSLog(@"show the view %@", someView);

    for(UIView *aView in someView.subviews){  // doesn't output anything

        NSLog(@"tag %d", aView.tag);

    }

}

此时,someView-var再次为空 - 为什么????

我假设,当我使用@property(非原子,保留)时,变量会自动保留?

我还尝试在初始化时保留变量:

someView = [[UIView alloc] retain];

不起作用

someView = [[UIView alloc] init];
[someView retain];

也不起作用......

我到底在做什么?

感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

很少。

someView = [[UIView alloc] init];
someView = myView;

以上是错误的。首先,您要创建一个新的UIView实例并将其分配给someView。然后,您将myView分配给someView。这导致内存泄漏,因为您从未发布过someView,只是重新分配了它。

我认为你要做的是:

[someView release];
someView = [myView retain];

然后,当你完成它时,你必须确保释放someView

这是@property (nonatomic, retain)将要执行的操作,但要使用您必须执行的操作:

[self setSomeView:myView];

答案 1 :(得分:0)

如果不使用自带点表示法,则不保留分配给属性的对象。

您需要使用:

self.someView = myView;

for(UIView *aView in self.someView.subviews){

自表示法调用管理保留的综合访问器方法。如果您不使用self,则无法正确保留任何内容。

答案 2 :(得分:0)

好的 - 我想,我尽可能做错了一切;)

我应该提到,我想,我已经在IB中建立了观点。在那里,我把我正在谈论的课程添加到我的父母视图中(听起来令人困惑,我知道 - 但是,嘿,这是IB :) ...

目标是弹出某种覆盖视图 - 但我不想将该视图放在单独的nib文件中。所以,这就是我刚从类库中添加类的原因。

我现在终于放弃并将叠加层移动到一个单独的笔尖,使我的班级成为一个视图控制器......一切正常......

无论如何,谢谢你的提示,伙计们 - 我确实学到了很多......