将 plist 数据加载到 UITableView 时从不调用惰性初始化程序
Posted
技术标签:
【中文标题】将 plist 数据加载到 UITableView 时从不调用惰性初始化程序【英文标题】:Lazy Initializer Never Called When Loading plist data into UITableView 【发布时间】:2011-12-27 09:33:39 【问题描述】:我正在尝试将一个简单的 plist 文件(在根目录下有一个数组)加载到 UITableView(在 XCode 4.2 选项卡式应用程序的第一个视图中)。我以前在其他(XCode 3)项目中做过这个,但由于某种原因,我的数组的惰性初始化器似乎永远不会被调用。
.h 文件:
#import <UIKit/UIKit.h>
@interface NailPolishFirstViewController : UIViewController
NSMutableArray *myCollection;
@property(nonatomic, retain) NSMutableArray *myCollection;
@end
.m 文件(相关部分)
#import "NailPolishFirstViewController.h"
@implementation NailPolishFirstViewController
@synthesize myCollection;
// ...
- (NSMutableArray *) myCollection
if (myCollection == nil)
NSString *path = [[NSBundle mainBundle] bundlePath];
NSString *finalPath = [path stringByAppendingPathComponent:@"database.plist"];
self.myCollection = [NSMutableArray arrayWithContentsOfFile:finalPath];
NSLog(@"Collection size: %@", [self.myCollection count]);
return myCollection;
// ...
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
return 1;
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
NSLog(@"Getting rows ... %@", [myCollection count]);
return [myCollection count];
// ...
此控制器的 xib 文件附加了一个 UITableView,并且数据源和委托设置为文件的所有者。
当我构建和运行时,numberOfRowsInSection 正在记录“Getting rows ... (null)”,但我的懒惰初始化程序中 myCollection 的日志从未显示。为什么它从来没有被调用?
【问题讨论】:
【参考方案1】:您没有通过访问器。使用[myCollection count]
是直接访问ivar,这将是nil。如果你要使用延迟加载,你必须总是通过self.myCollection
否则它永远不会调用你的访问器,也永远不会填充记录。
【讨论】:
【参考方案2】:由于 myCollection 是一个声明的属性,它需要引用它的访问器。尝试将其称为self.myCollection
。
例如
- (NSMutableArray *) myCollection
if (myCollection == nil)
NSString *path = [[NSBundle mainBundle] bundlePath];
NSString *finalPath = [path stringByAppendingPathComponent:@"database.plist"];
myCollection = [NSMutableArray arrayWithContentsOfFile:finalPath];
NSLog(@"Collection size: %@", [self.myCollection count]);
return myCollection;
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
NSLog(@"Getting rows ... %@", [self.myCollection count]);
return [self.myCollection count];
【讨论】:
以上是关于将 plist 数据加载到 UITableView 时从不调用惰性初始化程序的主要内容,如果未能解决你的问题,请参考以下文章
来自 plist 的 UITableView 加载到字典的 NSArray
从下载的 plist 中重新加载 UITableView 数据