2009-10-06 23 views
1

在我的iPhone应用程序中,视图在转换时通常会缓慢加载,就像用户单击Tab Bar Controller上的按钮一样。如果手机内存不足,则会发生这种情况。它在3GS手机上并不真正出现,但这是3G手机的一个大问题。在3G iPhone上的视图之间切换时视图加载速度缓慢 - 如何更改我的风格?

我怀疑我没有遵循创建UIViewControllers的一些最佳实践。我想我可能在init函数中做得太多了,而不是使用viewDidLoad函数或其他东西。这似乎影响了我所有的观点,所以我认为这是我的风格问题,而不是一些特定的片段。

谁能告诉我我可能会做错什么?下面是一个示例代码,来自一个UIViewController子类:

编辑:在回应这个问题:“这是被称为?

当用户点击地图上的标记这个函数被调用在这种情况下:

if(marker.label.tag == SavedBookmarkTag) { 

    SavedDetailScreen *savedBookmark = [[[SavedDetailScreen alloc] initBookmarkView: 
    [(NSDictionary *)marker.data objectForKey:@"bookmark"]]autorelease]; 
    [savedBookmark showMap]; 
    [self.navBar pushViewControllerWithBackBar:savedBookmark]; 
    return; 

} 

编辑完

-(id)initBookmarkView: (Bookmark *)bm { 

    self = [self initView]; 
    self.bookmark = bm; 

    primaryLabel.text = [bm title]; 
    secondaryLabel.text = [self getLineWithLat:[bm lat] AndLon:[bm lon] AndDate:[bm timeCreated]]; 
    return self; 

} 


- (id)initView { 

    self = [super init]; 
    self.isWaypoint = NO; 

    UIImageView *bg = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"238-beveled-background.png"]]; 

    bg.frame = CGRectMake(0, 0, 320, 376); 
    [self.view addSubview:bg]; 
    bg = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"small-label.png"]]; 
    [self.view addSubview:bg]; 
    [bg release]; 

    self.primaryLabel = [[UILabel alloc]init]; 
    primaryLabel.font = TITLE_FONT; 
    primaryLabel.backgroundColor = [UIColor clearColor]; 
    primaryLabel.textColor = LIGHT_BLUE; 

    self.secondaryLabel = [[UILabel alloc]init]; 
    secondaryLabel.font = TEXT_FONT; 
    secondaryLabel.backgroundColor = [UIColor clearColor]; 
    secondaryLabel.textColor = LIGHT_BLUE; 
    secondaryLabel.lineBreakMode = UILineBreakModeClip; 

    self.thirdLabel = [[UILabel alloc]init]; 
    thirdLabel.font = TEXT_FONT; 
    thirdLabel.backgroundColor = [UIColor clearColor]; 
    thirdLabel.textColor = LIGHT_BLUE; 
    thirdLabel.lineBreakMode = UILineBreakModeCharacterWrap; 

    [self.view addSubview:primaryLabel]; 
    [self.view addSubview:secondaryLabel]; 
    [self.view addSubview:thirdLabel];  

    self.loadingBackground = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"stats-box.png"]]; 
    loadingBackground.frame = CGRectMake(0, 115, loadingBackground.frame.size.width, loadingBackground.frame.size.height); 
    [self.view addSubview:loadingBackground]; 
    [self.view sendSubviewToBack:loadingBackground]; 

    AnimatedGif *animatedGif = [[[AnimatedGif alloc] init] autorelease]; 
    NSData *data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"35" ofType:@"gif"]]; 
    [animatedGif decodeGIF: data]; 

    UIImageView *loadingImage = [animatedGif getAnimation]; 
    loadingImage.frame = CGRectMake(150,150,loadingImage.frame.size.width,loadingImage.frame.size.height); 

    [loadingImage startAnimating];  
    [loadingBackground addSubview:loadingImage]; 
    [loadingImage release]; 

    [self layoutSubviews]; 

    return self; 

} 


- (void) layoutSubviews { 

    self.view.frame = CGRectMake(0,0,320,372); 
    primaryLabel.frame = CGRectMake(30, 30, 260, 18); 
    secondaryLabel.frame = CGRectMake(30 ,52, 260, 16); 
    thirdLabel.frame = CGRectMake(30, 72, 260, 16); 

} 
+0

问题:self.view在哪里设置?在.xib中,或在其他方法?另外,什么叫initBookmarkView? – cduhn 2009-10-07 01:36:14

回答

1

,你可以看到大概是缓慢归因于构建对象和从闪存读取数据都是昂贵的过程。寻找重复使用现有对象而不是多次构建它们的机会,并考虑延迟特别昂贵的操作,直到显示视图之后。

在这种情况下,我会与一对夫妇的变化开始:

  1. 让savedBookmark一个成员变量,这样就可以建构一次和重用。将您的initBookmarkView:方法替换为一个setBookmarkView:方法,您可以在构造该成员变量之后调用该方法,以重新配置要显示的特定书签的标签。

  2. 将子视图创建代码从initView中取出并放入loadView中。这是以编程方式构建自己的视图层次结构的最合适的地方。 UIViewController在其视图属性上实现延迟加载,以尽可能延迟构造。视图属性是零,直到它第一次被请求。此时UIViewController调用loadView来设置属性。如果定义了一个nib文件,默认的实现会加载该视图。否则,它只是构造一个空的UIView并使其成为主视图。请注意,您必须构建容器视图并自己设置视图属性。

在其他应用程序,你可以通过移动一些初始化代码到viewDidLoad中:,被装载在视图属性后调用,无论是编程或从笔尖得到一些改善。如果您从远程URL加载图像的操作非常缓慢,则可能需要开始在viewDidLoad中异步加载数据,然后在数据加载完成后更新子视图。在某些情况下,您可能还想推迟一些代码,直到viewDidAppear :.请注意,每次出现视图时都会调用此方法,与loadView和viewDidLoad不同,它只调用一次。