Objective c 如何在声明为属性时初始化NSArray/NSMutableArray

Objective c 如何在声明为属性时初始化NSArray/NSMutableArray,objective-c,nsmutablearray,nsarray,Objective C,Nsmutablearray,Nsarray,我需要一些帮助来理解如何使用NSArray/NSMutableArray作为属性 数组应该是什么属性:强还是复制?在哪种情况下我应该使用哪个属性 如何在代码中初始化数组 我的属性数组应该是NSArray还是NSMutableArray 目前我的做法有以下两种。但这一切都是零碎的,对其机制没有明确的理解。哪一个是正确的或不正确的 方法1 .m文件 接口() @属性(非原子,强)NSMutableArray*arrayOfData; 实施 self.arrayOfData=[nsmutablear

我需要一些帮助来理解如何使用NSArray/NSMutableArray作为属性

  • 数组应该是什么属性:强还是复制?在哪种情况下我应该使用哪个属性
  • 如何在代码中初始化数组
  • 我的属性数组应该是NSArray还是NSMutableArray
  • 目前我的做法有以下两种。但这一切都是零碎的,对其机制没有明确的理解。哪一个是正确的或不正确的

    方法1


    .m文件
    接口()
    @属性(非原子,强)NSMutableArray*arrayOfData;
    实施
    self.arrayOfData=[nsmutablearraywhithcapacity:count];
    [self.arrayOfData addObject:]
    
    方法2


    .h文件
    @属性(非原子,强)NSArray*arrayOfData;
    .m文件
    //属性设置器
    -(void)setListOfData:(NSMutableArray*)新列表{
    如果(_arrayOfData!=newList){
    _arrayOfData=[新列表副本];
    }
    }     
    //用于初始化arrayOfData的函数
    NSMutableArray*newData=[[NSMutableArray alloc]init];
    ..…<添加数据的代码>
    self.arrayOfData=新数据;
    
    NSArray或NSMutableArray 那么,是使用
    NSArray
    还是
    NSMutableArray
    很大程度上取决于您的用例。 您是否在运行时更改数组的内容,但仅在此处或此处更改少数项?使用
    NSMutableArray
    (非常适合可编辑的
    UITableView
    s数据源)。您是否总是使用全新的数据重新加载数据源?在这种情况下,我只需要使用
    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
    显示tweet列表。假设您将有一个名为
    -(NSArray*)\u getnewweets
    的私有方法,该方法将从服务器获取推文并返回一个
    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.DownloadedWeets时,数组将被创建为空,您可以继续添加/移动/删除项目。不需要为另一个数组覆盖此数组,一个就足够了。我使用了
    -addObjectsFromArray:
    ,但是当然你也可以使用
    -addObject:
    。现在清楚了吗?

    这太笼统了。我可以写一本书中关于你的每个问题的整整一章。你需要指定这是一个创建为空并随时间修改的数组,还是一个概念上(如果不是实际的话)只读的数组,在创建时完全初始化,以后再也不会修改。数组正在被修改。我正在使用addObject向数组添加数据。我的困惑是如何实际初始化它,当我在代码中使用方法1或方法2时,即在setter/getterIt外部使用方法1或方法2,然后稍微澄清一下。getter将返回一个空数组,现在如何向其中添加数据。我是直接向其中添加数据,即某行[self.arrayOfData addObject:]还是创建一个本地nsmutable数组,向其中添加数据,然后将该本地数组分配给我的属性数组,即NSMutableArray*localArray=[[NSMutableArray alloc]init][localArray addObject:]。然后说self.arrayOfData=localArray;或者self.arrayOfData=[localArray copy]让我展开我的答案来回答这个问题?因此,如果您有
    NSArray*arr=@[a,b,c]
    并调用
    NSArray*arrCopy=[arrCopy]
    ,您的
    arrCopy===@[a,b,c]
    ,而不是
    arrCopy!=@[aCopy、bCopy、cCopy]
    +1。很好的解释。您是否可以向我解释一下,在您的类.m文件的方法范围内,
    self.myArray
    在做什么?@Chisx对不起,我不确定我是否理解您的问题。你能详细说明一下吗?
    @interface TwTableViewController : UITableViewController
    @property (nonatomic, strong) * downloadedTweets;
    - (void) fetchNewData;
    @end
    
    @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