我需要一些帮助来理解如何使用NSArrays / NSMutableArrays作为属性。
目前,我采用的方式有两种,如下所示。但它完全不完整,没有明确理解它的机制。哪一个是正确的还是不正确的。
方法1
.m file
interface()
@property (nonatomic, strong) NSMutableArray *arrayOfData;
implementation
<....other code>
self.arrayOfData = [NSMutableArray arrayWithCapacity:count];
[self.arrayOfData addObject:<my object>]
方法2
.h file
@property (nonatomic, strong) NSArray *arrayOfData;
.m file
//Property setter
- (void)setListOfData:(NSMutableArray *)newList {
if (_arrayOfData != newList) {
_arrayOfData = [newList copy];
}
}
//Function which initializes the arrayOfData
NSMutableArray *newData = [[NSMutableArray alloc] init];
.....<code which adds data>
self.arrayOfData = newData;
答案 0 :(得分:5)
嗯,是否使用NSArray
或NSMutableArray
在很大程度上取决于您的使用案例。
您是在运行时更改数组的内容,但这里或那里只有几个项目?使用NSMutableArray
(非常适合可编辑的UITableView
数据源)。您是否总是使用全新数据重新加载数据源?在这种情况下我只会使用NSArray
。
这又取决于你想做什么。如果有人在调用该属性时希望他们获取自己的数据源副本,请使用copy
。但我实际上从未使用过这种方式,我认为90%的用例最好使用strong
。这意味着.arrayOfData
的调用者会获得指向类中NSArray
的指针(因此可以检测对其的更改)。
正如我所提到的,我通常使用NSMutableArray
作为UITableView
数据源。在头文件中我有
@property (nonatomic, strong) NSMutableArray *arrayOfData;
和你一样。我的做法不同的是,在.m
文件中,我覆盖了getter
,懒得给我一个NSMutableArray
。因此,我将单独留下setter并执行以下getter
实现。
- (NSMutableArray *) arrayOfData
{
if (!_arrayOfData) {
_arrayOfData = [NSMutableArray new];
}
return _arrayOfData;
}
这样,第一次在类中使用self.arrayOfData
时,它就会被分配并初始化并保存到实例变量中。然后从第二次开始它将继续返回实例变量。希望这能清除它。
示例用例:您有一个Twitter客户端TwTableViewController
显示推文列表。假设您将拥有一个名为-(NSArray*)_getNewTweets
的私有方法,该方法将从服务器获取推文并返回NSArray
。要做到这一点,你也可以创建一个fetchNewData
方法。请参阅下面的流程。
TwTableViewController.h
:
@interface TwTableViewController : UITableViewController
@property (nonatomic, strong) * downloadedTweets;
- (void) fetchNewData;
@end
TwTableViewController.m
:
@implementation TwTableViewController
- (NSMutableArray *) downloadedTweets
{
if (!_downloadedTweets) {
_downloadedTweets = [NSMutableArray new];
}
return _downloadedTweets;
}
- (NSArray *)_getNewTweets
{
NSArray * newTweets = ... //whatever magic to download new tweets
return newTweets;
}
- (void) fetchNewData
{
[self.downloadedTweets addObjectsFromArray:[self _getNewTweets]];
[self.tableView reloadData]; //animated would be prettier, but out of this scope
}
- (void) viewDidLoad
{
[super viewDidLoad];
[self fetchNewData];
}
//tableview stuff
@end
第一次调用self.downloadedTweets
时,数组将被创建为空,您可以继续添加/移动/删除项目。不需要为另一个数据覆盖这个数组,一个就足够了。我使用了-addObjectsFromArray:
但当然您也可以使用-addObject:
。现在更清楚了吗?