懶惰加載的目標C
回答
懶加載一般模式總是或多或少相同:
- (Whatever *)instance
{
if (_ivar == nil)
{
_ivar = [[Whatever alloc] init];
}
return _ivar;
}
- 在你的類中,添加你需要的類型的實例變量,並初始化在構造函數中零;
- 爲該ivar創建一個getter方法;
- 在getter中,測試nil。如果是這樣,請創建該對象。否則,只需返回參考。
如果你想能夠設置它,你可以使用@property和@synthesize?如果是這樣,你分配屬性的屬性(例如,非原子,強等)? – avance 2013-07-02 23:14:01
從最新版本的Xcode開始不再需要'@ synthesize',但是,您可以隨時定義'@ property',並在您的類實現中覆蓋setter和getter。屬性(強,弱等)只能用於反映你自己的實現;編譯器會將您的代碼替代生成任何代碼。希望這可以幫助。 – 2013-07-08 14:55:14
有沒有真正簡單的庫可以幫助您實現這一目標? – fatuhoku 2015-01-23 14:33:02
下面是從核心數據模板延遲加載的例子:
- (NSManagedObjectModel *)managedObjectModel
{
if (managedObjectModel != nil) {
return managedObjectModel;
}
managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
return managedObjectModel;
}
第一次managedObjectModel
的要求,它是由代碼創建。任何時間後,它已經存在(!= nil
),並剛剛返回。這是延遲加載的一個例子。還有其他的種類,例如延遲加載NIB文件(只在需要時將它們加載到內存中)。
在你的* .h類 isDragging_msg和isDecliring_msg這2個是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;
}
好方法........ – Wolverine 2013-01-24 07:19:29
根據Apple,這將是合適的方式。我同意他們出於多種原因:
- 一個
static
方法中的變量將持續多次調用。 dispatch_once
功能GDC將保證給定的代碼塊只運行一次。- 它是線程安全的。
的Objective-C:
- (AnyClass*)instance {
static AnyClass *shared = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
shared = [[AnyClass alloc] init];
});
return shared;
}
- 1. 懶惰加載不加載
- 2. 懶惰加載flexslider
- 3. GWT懶惰加載
- 4. Android懶惰加載
- 5. 懶惰加載Ninject
- 6. Autofac懶惰加載
- 7. Eclipselink懶惰加載
- 8. 懶惰加載wpf組合框項目
- 9. 角度材質標籤懶惰加載
- 10. 學說懶惰加載
- 11. Hibernate懶惰加載HQL
- 12. 混淆懶惰加載
- 13. 是ZODB PersistentLists懶惰加載?
- 14. 懶惰在Blogger上加載
- 15. Android listview懶惰加載
- 16. 動畫懶惰加載ArrayAdapter
- 17. 懶惰加載視圖
- 18. 懶惰加載CSS與js
- 19. jQuery mobile listviews懶惰加載
- 20. 用webpack懶惰加載angular2
- 21. 懶惰的圖像加載和卸載
- 22. 懶惰加載和懶惰評估有什麼區別?
- 23. 在實體框架中加載懶惰集合太懶惰
- 24. 懶惰加載和卸載圖像
- 25. 懶惰,重載的C++ &&運算符?
- 26. 懶惰加載的R包的更新
- 27. WCF/EF 4.1的問題懶惰加載
- 28. 懶惰的圖像加載器
- 29. 流利的nHibernate - 不是懶惰加載
- 30. 懶惰的領域總是加載
延遲加載究竟是什麼?你在使用核心數據嗎?如果是這樣,有關於性能考慮的很好的文檔。 – 2010-01-08 07:16:08