我听说延迟加载技术对提高程序性能非常有帮助。我正在为iPhone开发游戏。我不确定如何在目标C中应用延迟加载。有人能告诉我这个例子吗?
提前致谢
答案 0 :(得分:28)
延迟加载的一般模式总是或多或少相同:
- (Whatever *)instance
{
if (_ivar == nil)
{
_ivar = [[Whatever alloc] init];
}
return _ivar;
}
答案 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
变量将持续多次调用。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;
}