6

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

  1. 数组应该是什么属性:强或复制?在什么情况下我应该使用哪个属性?
  2. 如何在代码中初始化数组。
  3. 我的属性数组应该是 NSArray 还是 NSMutableArray

目前我这样做的方式有两种不同的方式,如下所示。但这一切都是零散的,并且没有清楚地了解它的机制。其中哪一项是正确的或错误的。

方法一


 .m file
    interface() 
           @property (nonatomic, strong) NSMutableArray *arrayOfData;
    implementation
         <....other code>

          self.arrayOfData = [NSMutableArray arrayWithCapacity:count];
         [self.arrayOfData addObject:<my object>]

方法二


 .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;
4

1 回答 1

7

NSArray 或 NSMutableArray

好吧,是否使用NSArrayNSMutableArray在很大程度上取决于您的用例。您是否在运行时更改了数组的内容,但这里或那里只有几个项目?使用NSMutableArray(非常适合可编辑UITableView的数据源)。您是否总是用全新的数据重新加载数据源?我只是NSArray在这种情况下使用。

强或复制

这又取决于你想做什么。如果,当有人调用该属性时,您希望他们获得自己的数据源副本,请使用copy. 但实际上我从未以这种方式使用过它,而且我认为对于 90% 的用例,您最好使用strong. 这意味着调用者.arrayOfData会获得指向NSArray类中的指针(因此可以检测到对它的更改)。

如何使用

正如我所提到的,我通常使用NSMutableArrayfor likeUITableView数据源。在我的头文件中

@property (nonatomic, strong) NSMutableArray *arrayOfData;

和你一样。我所做的不同之处在于,在.m文件中,我覆盖了getter懒惰地为我创建一个NSMutableArray. 因此,我将不理会 setter 并进行以下getter实现。

- (NSMutableArray *) arrayOfData
{
    if (!_arrayOfData) {
        _arrayOfData = [NSMutableArray new];
    }
    return _arrayOfData;
}

这样,当您第一次self.arrayOfData在类中使用时,它会被分配并初始化并保存到实例变量中。然后从第二次开始,它将继续返回实例变量。希望这能澄清一点。

编辑

示例用例:您有一个TwTableViewController显示推文列表的 Twitter 客户端。假设您将有一个名为的私有方法-(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:。现在清楚了吗?

于 2013-09-13T20:55:24.490 回答