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

时间:2013-09-13 20:43:31

标签: objective-c nsmutablearray nsarray

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

  1. 数组应该具有哪些属性属性:强还是复制?在哪种情况下我应该使用哪个属性?
  2. 如何在代码中初始化数组。
  3. 我的属性数组应该是NSArray还是NSM​​utableArray
  4. 目前,我采用的方式有两种,如下所示。但它完全不完整,没有明确理解它的机制。哪一个是正确的还是不正确的。

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

1 个答案:

答案 0 :(得分:5)

NSArray或NSMutableArray

嗯,是否使用NSArrayNSMutableArray在很大程度上取决于您的使用案例。 您是在运行时更改数组的内容,但这里或那里只有几个项目?使用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:。现在更清楚了吗?