以编程方式创建视图而不是使用界面构建器

时间:2014-02-21 17:10:44

标签: ios objective-c

以编程方式创建视图时,我必须将子视图视为强大,因为我实例化它们,当我将它们添加到Container时,容器也将它们视为强大的

我想知道它是否会创建一个会导致内存泄漏的参考周期,如果是,那将是最好的方法

编辑

例如我有一个名为InterfaceBuilder的类,在这种情况下包含一个构建加载视图的函数:

-(UIView*) buildLoadingView :(SuiviCommercialViewController*) viewController
{
    UIView *view = [[UIView alloc] initWithFrame:viewController.view.frame];

    UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0.1, 0, view.bounds.size.width, 50)];
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0.1, 0, view.bounds.size.width, 50)];
    [imageView setImage: [UIImage imageNamed:@"ToolBar_white_1"]];
    [headerView addSubview:imageView];

    UILabel *title = [[UILabel alloc] initWithFrame:CGRectMake((view.bounds.size.width/2)-100, 15, 200, 20)];
    title.backgroundColor = [UIColor clearColor];
    title.text = [NSString stringWithFormat:@"Mon suivi propriétaires(s)"];
    title.font = [UIFont fontWithName:@"Helvetica-Bold" size:16];
    [title sizeToFit];
    [headerView addSubview:title];

    viewController.activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    viewController.activityIndicator.frame=CGRectMake(view.bounds.size.width/2, view.bounds.size.height/2, 20, 20);
    viewController.activityIndicator.color = [UIColor blackColor];
    [view addSubview:viewController.activityIndicator];

    [view addSubview:headerView];

    return view;

}

2 个答案:

答案 0 :(得分:1)

没有参考周期。

当Superview对其子视图有强烈引用时,参考周期就会发生,并且Subview强烈引用Superview。

答案 1 :(得分:1)

您所描述的内容不应该创建循环引用,但如果没有看到您的确切代码,则无法确定。但是如果两个对象引用同一组对象,它只是意味着它(可能)将这些对象稍微长一点,以便取消分配,因为它们等待两个不同的其他对象最终被释放。

现在,如果你引用的那些子视图中的任何一个子视图都有引用回容器视图或其他对它们有强引用的对象,那么你将有一个循环引用,内存永远不会被释放除非您通过设置nil的引用明确地将其分解。您也可以将对子视图的引用设置为弱,这样可以减少保留周期的可能性。

如果你只是因为他们在将它们添加为子视图之前被解除分配而使它们变得强大,你可以使用一个本地变量来保持强引用,直到你可以将它添加为子视图,如下所示:

UIView *subview = [[UIView alloc] init]; // subview keeps a strong reference while in the scope of the method
self.firstSubview = subview; // property firstSubview is a weak property
[self.containerView addSubview:subview]; // The container view now has a strong reference to subview, so when the local variable goes out of scope, it won't get deallocated