向viewcontrollers默认视图添加许多子视图会使我的应用程序变慢吗?

时间:2008-10-31 03:39:41

标签: iphone objective-c cocoa-touch

我有一个应用程序,我创建了许多uiviews并将它们添加到UIViewController的self.view中。我的应用运行速度非常慢。我释放所有对象并且没有内存泄漏(我运行了性能工具)。任何人都可以告诉我什么可能使我的应用程序这么慢? (代码如下)

[编辑]阵列有大约30个项目。 [/ EndEdit中]

非常感谢!

以下是我的UIViewController的loadView方法的代码:

- (void)loadView {

    UIView *contentView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
    contentView.backgroundColor = [UIColor whiteColor];
    self.view = contentView;
    [contentView release]; 



    int length = 0;
    for(NSString *item in arrayTips)
    {
        length++;
        [item release];
    }
    int index = 0;
    for(NSString *item in arrayTitles)
    {
        SingleFlipView *backView = [[SingleFlipView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];



        backView.userInteractionEnabled = YES;
        backView.backgroundColor = [UIColor whiteColor];
        [backView setViewIndex:index];
        [backView setLastViewIndex:length];
        CGRect labelFrame = CGRectMake(10.0f, 0.0f, 300.0f, 30.0f);
        UILabel *backLabel = [[UILabel alloc] initWithFrame:labelFrame];
        backLabel.textAlignment = UITextAlignmentCenter;
        backLabel.userInteractionEnabled = YES;
        backLabel.text = item;
        backLabel.font = [UIFont fontWithName:@"Georgia" size:24.0f];
        backLabel.textColor = [UIColor blackColor];
        backLabel.backgroundColor = [UIColor whiteColor];

        CGRect textFrame = CGRectMake(10.0f, 30.0f, 300.0f, 110.0f);
        UITextView *tbxView = [[UITextView alloc] initWithFrame:textFrame];
        tbxView.textAlignment = UITextAlignmentCenter;
        tbxView.userInteractionEnabled = YES;
        tbxView.editable = FALSE;
        tbxView.text = [arrayTips objectAtIndex:index];
        tbxView.font = [UIFont fontWithName:@"Arial" size:14.0f];
        tbxView.textColor = [UIColor blackColor];
        tbxView.backgroundColor = [UIColor whiteColor];

        //CGRect labelFrame = CGRectMake(10.0f, 0.0f, 84.0f, 30.0f);
        UIImage *nextTip = [[UIImage imageNamed:@"NextTip.png"] retain];
        UIImageView *nextTipView = [ [ UIImageView alloc ] initWithImage:nextTip];
        nextTipView.frame = CGRectMake(230.0f, -10.0f, 84.0f, 30.0f);
        nextTipView.userInteractionEnabled = YES;


        UIImageView *view = [[ UIImageView alloc ] init];
        view.userInteractionEnabled = YES;
        if(self.sexString == @"Men")
        {
            UIImage *imgTip = [[UIImage imageNamed:@"feet_small.jpg"] retain];
            view.image = imgTip;
            view.frame = CGRectMake(0.0f, 110.0f, 416.0f, 228.0f); //59*161
            [imgTip release];
        }

        [backView addSubview:view];
        [backView addSubview:tbxView];
        [backView addSubview:backLabel];
        //[backView addSubview:nextTipView];

        [self.view addSubview:backView];
        [backView release];
        [backLabel release];
        [nextTip release];
        [nextTipView release];
        [tbxView release];
        [view release];

        index++;

        [item release];
    }


}

3 个答案:

答案 0 :(得分:4)

这将取决于arrayTitles中有多少项。如果您只是添加其中的一个或两个,您不应该看到巨大的减速;更多,你会的。您应该看看UITableView处理其单元格的方式;只创建它们,因为它们实际上是需要/使用的,或者更好的是,只创建其中一个,并即时设置其内容。

其他几点说明:

  • ==不是Objective-C中有效的字符串比较运算符;使用[string1 isEqualTo:string2]
  • 看来你正试图在屏幕上同时放置很多这些,这似乎不太合理。
  • 看起来你在那里有一个虚假的[item release](你永远不会保留item,所以没有必要释放它。
  • 整个第一个循环( for(NSString *item in arrayTips)...使我感到害怕和困惑; NSArrays中的项目已经被数组保留。您不必以这种方式明确地保留/释放它们。

答案 1 :(得分:3)

拥有深层视图层次结构可能会导致速度变慢,您可以通过使用自定义视图对其进行展平来解决这些问题,但如果您使用的是简单视图,则屏幕上可能会有数十个视图,而且没有明显的性能影响,所以一般情况下我建议忽略开发时的视图数量,然后减少视图数量,如果它被证明是性能问题。

话虽如此,你似乎正在设置一些具有无限大量观点的东西,这是不好的。在不知道数组标题中有多少条目的情况下,我无法确切地告诉你究竟发生了什么,但我怀疑,虽然你正在创建的每个backView的实际视觉heiarchy都很好,但是为数组中的每个项目制作了一个backView使用索引让最前面的一个隐藏其后面的所有其他东西会导致你有太多的观点。

那么,如何测试它:

在for循环的底部添加一个中断。在单次迭代后使循环退出并查看性能是否有所改善。如果是这样,那么巨大的视图层次结构就是你的问题。你可能不得不破解改变索引的例程,以确保它永远不会交换到无效的索引进行测试。

如果是这种情况,您有几个选择。你可以实现一个自定义视图并将每个后视图展平到一个视图中,但是根据你有多少不足就足够了,而不仅仅是按照你现在的方式构建后视图,而是按需而不是在加载时:

1)将for循环中的代码重构为一个单独的方法,该方法为特定标题生成backView,并将其附加到视图中。 2)您当前正在改变索引以使后视图可见,而是调用新方法以实际构建并附加当时的后视图

答案 2 :(得分:1)

不要忘记让尽可能多的视图不透明。透明视图是性能问题的主要来源。