如何在声明为属性时初始化NSArrays/NSMutableArrays

Vid*_*sal 6 objective-c nsmutablearray nsarray

我需要一些帮助来理解如何使用NSArrays/NSMutableArrays作为属性.

  1. 数组应该具有哪些属性属性:强还是复制?在哪种情况下我应该使用哪个属性?
  2. 如何在代码中初始化数组.
  3. 我的属性数组应该是NSArray还是NSM​​utableArray

目前,我采用的方式有两种不同的方式,如下所示.但它完全不完整,没有明确理解它的机制.哪一项是正确的还是不正确的.

方法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)

cze*_*boy 7

NSArray或NSMutableArray

那么,是否使用NSArrayNSMutableArray严重依赖于您的用例.您是在运行时更改数组的内容,但这里或那里只有几个项目?使用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:.现在更清楚了吗?