Objective c 如何在声明为属性时初始化NSArray/NSMutableArray
我需要一些帮助来理解如何使用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
.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