Objective c 在视图控制器中维护到子视图的链接

Objective c 在视图控制器中维护到子视图的链接,objective-c,ios,uiview,uiviewcontroller,Objective C,Ios,Uiview,Uiviewcontroller,以下是我的情况:我有一个管理子视图层次结构的UIViewController,可能如下所示: 此视图是从.xib构建的。我希望能够保持对topView的每个子视图的访问权限–也就是说,我希望每个子视图都有一个指针,这样我就可以,例如,说: [button1 setText:@"Hello!"]; Assigning retained object to weak variable; object will be released after assignment 通常,要做到这一点,我使

以下是我的情况:我有一个管理子视图层次结构的
UIViewController
,可能如下所示:

此视图是从
.xib
构建的。我希望能够保持对topView的每个子视图的访问权限–也就是说,我希望每个子视图都有一个指针,这样我就可以,例如,说:

[button1 setText:@"Hello!"];
Assigning retained object to weak variable; object 
will be released after assignment
通常,要做到这一点,我使用Interface Builder将我希望访问的每个元素连接起来,从而生成一个类似以下内容的标题:

@interface MyViewController : UIViewController
{
    __weak IBOutlet UIView *view;
    __weak IBOutlet UILabel *label;
    __weak IBOutlet UIButton *button1;
    __weak IBOutlet UIButton *button2;
}

@end
这些实例变量是
\uu-weak
,这很好,因为当我的视图控制器“获取”它们时,它们已经属于我的视图控制器的根视图(令人困惑的是,我在快速图表中标记为“topView”)。事实上,我希望这些引用是弱的——当我的根视图被释放时,它的所有子视图也应该被释放。太好了

但假设我想创建UI的一个新元素,可能是一个自定义按钮,完全用代码。我将此元素称为
CustomViewClass
,它将从
UIView
子类化。我将创建的
CustomViewClass
实例将被称为
customButton
。与视图的其他子视图一样,我希望“访问”到
customButton
,以便与之交互。然而,我知道,像任何其他子视图一样,
customButton
将属于它的superview,这就是它应该是什么样子的——同样,我希望它在我的视图发布时被发布。这使我认为我应该将此视图声明为视图控制器的
\uu-weak
实例变量或属性。让我们这样做:

@interface MyViewController : UIViewController
{
    __weak IBOutlet UIView *view;
    __weak IBOutlet UILabel *label;
    __weak IBOutlet UIButton *button1;
    __weak IBOutlet UIButton *button2;
    __weak CustomViewClass *customButton;
}

@end
然后,在我的实施中:

@implementation MyViewController
- (void)viewDidLoad
{
    [super viewDidLoad];

    customButton = [[CustomViewClass alloc] init];
    [[self view] addSubview:customButton];
}
@end
正如您可能已经意识到的那样,这将不起作用,编译器将抛出一个启动警告。比如:

[button1 setText:@"Hello!"];
Assigning retained object to weak variable; object 
will be released after assignment
我现在用一些非常糟糕的方式来回避这种警告:

@implementation MyViewController
- (void)viewDidLoad
{
    [super viewDidLoad];

    CustomViewClass *customButtonLocal = [[CustomViewClass alloc] init];
    [[self view] addSubview:customButtonLocal];
    customButton = customButtonLocal;
}
@end
这样,我就能得到我想要的:

  • 屏幕上的CustomViewClass实例
  • …只有一个所有者,它的superview
  • …并且没有延迟变量(在块结束后立即释放customButtonLocal)
  • 但这不可能是“正确”的方法。最后,我的问题是:


    在不使用中间人解决方法的情况下,我应该如何分配和实例化这个以编程方式创建的
    \uu-weak
    变量?

    使
    CustomViewClass*customButton
    成为一个强有力的参考

    您通常将子视图的变量声明为
    \uuu
    的原因是这些链接的存在并不意味着所有权。子视图由从NIB/情节提要实例化的对象拥有。您直接拥有该对象,也间接拥有其从属对象


    customButton
    是一个不同的故事:您以编程方式创建它,因此您的NIB/故事板并不拥有它。因此,您应该引用它
    \uu strong
    (这是在没有圆弧修改器时的默认值)。

    @JonasAlves介意更具体一点吗?具体是什么导致内存泄漏?在什么情况下?100%清楚的是,答案没有导致OP内存泄漏,因此我非常感谢您的解释。