目标C中的延迟加载

时间:2010-01-08 07:12:14

标签: iphone objective-c

我听说延迟加载技术对提高程序性能非常有帮助。我正在为iPhone开发游戏。我不确定如何在目标C中应用延迟加载。有人能告诉我这个例子吗?

提前致谢

4 个答案:

答案 0 :(得分:28)

延迟加载的一般模式总是或多或少相同:

- (Whatever *)instance
{
    if (_ivar == nil)
    {
        _ivar = [[Whatever alloc] init];
    }
    return _ivar;
}
  1. 在您的课程中,添加您需要的类型的ivar,并在构造函数中将其初始化为nil;
  2. 为该ivar创建一个getter方法;
  3. 在吸气器中,测试零。如果是,请创建对象。否则,只需返回对它的引用。

答案 1 :(得分:6)

以下是来自Core Data模板的延迟加载示例:

- (NSManagedObjectModel *)managedObjectModel
{
    if (managedObjectModel != nil) {
        return managedObjectModel;
    }
    managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
    return managedObjectModel;
}

第一次要求managedObjectModel时,它是由代码创建的。在此之后的任何时间,它已经存在(!= nil)并且刚刚返回。这是延迟加载的一个例子。还有其他类型,例如延迟加载NIB文件(仅在需要时将它们加载到内存中)。

答案 2 :(得分:4)

根据Apple ,这将是的合适方式。我同意他们的原因有多种:

  • 方法中的static变量将持续多次调用。
  • GDC dispatch_once功能将保证给定的代码块只运行一次。
  • 它是线程安全的。

目标-C:

- (AnyClass*)instance {

    static AnyClass *shared = nil;
    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{
        shared = [[AnyClass alloc] init];
    });

    return shared;
}

答案 3 :(得分:3)

在你的* .h课程中 isDragging_msg和isDecliring_msg这两个是BOOL值。和 Dict_name NSMutableDictionary。

在视图中加载

Dict_name = [[NSMutableDictionary alloc] init];

在索引路径的行的单元格中

if ([dicImages_msg valueForKey:[[msg_array objectAtIndex:indexPath.row] valueForKey:@"image name or image link"]]) 
{ 
    cell.image_profile.image=[dicImages_msg valueForKey:[[msg_array objectAtIndex:indexPath.row] valueForKey:@"image name or image link"]];
}
else
{
    if (!isDragging_msg && !isDecliring_msg)
    {
        [dicImages_msg setObject:[UIImage imageNamed:@"Placeholder.png"] forKey:[[msg_array objectAtIndex:indexPath.row] valueForKey:@"image name or image link"]];
        [self performSelectorInBackground:@selector(downloadImage_3:) withObject:indexPath];
    }
    else
    {
        cell.image_profile.image=[UIImage imageNamed:@"Placeholder.png"];
    }
}

并且对于下载图像,该功能是: -

-(void)downloadImage_3:(NSIndexPath *)path
{
    NSAutoreleasePool *pl = [[NSAutoreleasePool alloc] init];

    NSString *str=[here Your image link for download];

    UIImage *img = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:str]]]; 

    [dicImages_msg setObject:img forKey:[[msg_array objectAtIndex:path.row] valueForKey:@"image name or image link same as cell for row"]];

    [tableview performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];

    [pl release];
}

最后将这些方法放在你的班级

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    isDragging_msg = FALSE;     
    [tableview reloadData];
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    isDecliring_msg = FALSE;
    [tableview reloadData]; 
}

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    isDragging_msg = TRUE;
}

- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView
{
    isDecliring_msg = TRUE; 
}