将 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?

如何将xml加载到plist

来自 plist 的 UITableView 加载到字典的 NSArray

从下载的 plist 中重新加载 UITableView 数据

如何将数据从基于 plist 的 UITableView 传递到 UIViewController

使用 plist 加载 UITableView 的内容