Vid*_*sal 6 objective-c nsmutablearray nsarray
我需要一些帮助来理解如何使用NSArrays/NSMutableArrays作为属性.
目前,我采用的方式有两种不同的方式,如下所示.但它完全不完整,没有明确理解它的机制.哪一项是正确的还是不正确的.
方法1
.m file
interface()
@property (nonatomic, strong) NSMutableArray *arrayOfData;
implementation
<....other code>
self.arrayOfData = [NSMutableArray arrayWithCapacity:count];
[self.arrayOfData addObject:<my object>]
Run Code Online (Sandbox Code Playgroud)
方法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;
Run Code Online (Sandbox Code Playgroud)
那么,是否使用NSArray或NSMutableArray严重依赖于您的用例.您是在运行时更改数组的内容,但这里或那里只有几个项目?使用NSMutableArray(适用于可编辑UITableView的数据源).您是否总是使用全新数据重新加载数据源?我只是NSArray在那种情况下使用.
这又取决于你想做什么.如果有人在调用该属性时希望他们获取自己的数据源副本,请使用copy.但我实际上从未使用过这种方式,我认为90%的用例你最好不要使用它strong.这意味着调用者.arrayOfData获取指向NSArray类中的指针(因此可以检测对它的更改).
正如我所提到的,我通常NSMutableArray用于UITableView数据源.在头文件中我有
@property (nonatomic, strong) NSMutableArray *arrayOfData;
Run Code Online (Sandbox Code Playgroud)
和你一样.我做的不同的是,在.m文件中,我重写getter懒惰创建我NSMutableArray.因此,我将单独留下制定者并进行以下getter实施.
- (NSMutableArray *) arrayOfData
{
if (!_arrayOfData) {
_arrayOfData = [NSMutableArray new];
}
return _arrayOfData;
}
Run Code Online (Sandbox Code Playgroud)
这样,第一次self.arrayOfData在类中使用时,它将被分配并初始化并保存到实例变量中.然后从第二次开始它将继续返回实例变量.希望这有点清除它.
示例用例:您有一个Twitter客户端,TwTableViewController显示推文列表.假设您将调用一个私有方法-(NSArray*)_getNewTweets,它将从服务器获取推文并返回给您NSArray.要做这件事你fetchNewData也要创建一个方法.请参阅下面的流程.
TwTableViewController.h:
@interface TwTableViewController : UITableViewController
@property (nonatomic, strong) * downloadedTweets;
- (void) fetchNewData;
@end
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
第一次调用时self.downloadedTweets,数组将被创建为空,您可以继续添加/移动/删除项目.不需要为另一个数据覆盖这个数组,一个就足够了.我用过-addObjectsFromArray:但当然你也可以使用-addObject:.现在更清楚了吗?
| 归档时间: |
|
| 查看次数: |
8763 次 |
| 最近记录: |