十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
//从plist文件中读取数据
10多年的凤凰网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。营销型网站建设的优势是能够根据用户设备显示端的尺寸不同,自动调整凤凰建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联公司从事“凤凰网站设计”,“凤凰网站推广”以来,每个客户项目都认真落实执行。
- (void)readDataFromPlist
{
//1.先获取文件路径
NSString * filePath = [[NSBundle mainBundle] pathForResource:@"Book" ofType:@"plist"];
//2.根据路径初始化字典对象
self.dic = [NSMutableDictionary dictionaryWithContentsOfFile:filePath];
//将不可边字典变成可变字典
self.addressBook = [NSMutableDictionary dictionaryWithDictionary:_dic];
//将字典封装成对象
//(1)从字典中遍历出key
for (NSString * key in self.dic) {
//根据key获取对应的数组
NSArray * groupArr =self.dic[key];
//(5) 创建可变的小数组,存储封装的对象
NSMutableArray * newGroupArr = [NSMutableArray array];
//(3)获取小数组中元素(遍历小数组)
for (NSDictionary * groupDic in groupArr) {
//(4)通过字典初始化AddressPerson
AddressPerson * Person = [[AddressPerson alloc]initWithDic:groupDic];
[newGroupArr addObject:Person];//将对象存储到新的可变数组中
RELEASE_SAFE(Person);
}
//将要原来key对应的存储字典的小数组替换成装有对象的心得可变的数组
[self.addressBook setObject:newGroupArr forKey:key];
}
//取出字典中所有的key
self.orderedKeys= [[self.addressBook allKeys]sortedArrayUsingSelector:@selector(compare:)];
// NSLog(@"%@",addressBook);
}
不管是NSArray,还是NSMutableArray ,alloc之后的得到都是__NSPlacrholderArray.
当我们nsarray一个空数组,得到的是__NSArray0
nsarray只有一个元素时,得到的是__NSSingleObjectArrayI
nsarray.count 1 时, 得到 __NSArrayI
nsmutablearray 返回的都是__NSArrayM
placeHolder 和 placeHoldes 的内存地址一样,说明是一个单例,该类内部只有一个isa指针,init后被新的实例换掉了
CFArray 是CoreFoundation中的, 和Foundation中的NSArray相对应,他们是Toll-Free-Briaged. 用的环形缓冲区实现的.
C数组的原理 连续的内存空间, 在下标0处插入一个元素时, 移动其后面所有的元素, 即memmove原理
同样的移除第一个元素,需要进行相同的动作
环形缓冲区,在删除的时候不会清楚指针, 如果我们在中间进行插入和删除, 只会移动最少的一边元素.
__NSArrayI{
NSInterger _userd; 数组的元素个数,调用[array count]时,返回的就是_userd的值。
id_list[0]; 当做id_list来用,即一个存储id对象的buff.由于__NSArrayI的不可变,所以_list一旦分配,释放之前都不会再有移动删除操作了。
}
从实现来看,如果_list还没有构成循环,第一次就获得了全部元素,跟__NSArrayI一样。但是如果_list构成了玄幻,就需要两次,第一次获取_offset到_list末端的元素,第二次获取存放在_list起始处的剩余元素。
__NSArrayM的_list是个循环数组,它的其实由_offset标识.
forin速度最快的原因是遵从了NSFastEnumertation协议,它是直接从C数组中去对象对于可变数组来说,最多只需要两次就可以获取全部数据。如果数组没有构成循环,第一次就获得了全部元素,跟不可变数组一样,如果数组构成了循环,那么就需要两次,第一次获取对象数组的起始偏移到循环数组末端的元素,第二次获取存放在循环数组起始处的剩余元素。而for循环之所以慢一点,是每次都要调用objectAtIndex:,添加@autoreleasepool,可以提高效率,如果我们每次遍历不需要知道下标,选择forin。
NSEnumerationConcurrent+Block的方式耗时最大,我认为是因为它采用多线程,就这个方法来讲,多线程的优势并不在遍历多快,它的回调在各个子线程。
1.使用普通的for循环
NSArray *ary = @[@"我",@"是",@"张",@"小",@"倍",@"er"];
for (int i = 0; i ary.count; i ++) {
NSLog(@"%@",[ary objectAtIndex:i]);
}
2.使用for in 进行遍历
NSArray *ary = @[@"我",@"是",@"张",@"小",@"倍",@"er"];
for (NSString *str in ary) {
NSLog(@"%@",str);
}
3.使用do while
NSArray *ary = @[@"我",@"是",@"张",@"小",@"倍",@"er"];
int i = 0;
do {
NSLog(@"%@",[ary objectAtIndex:i]);
i ++;
} while (i ary.count);
}
4.使用while do
NSArray *ary = @[@"我",@"是",@"张",@"小",@"倍",@"er"];
int i = 0;
while (i ary.count) {
NSLog(@"%@",[ary objectAtIndex:i]);
i ++;
}
5.使用快速枚举
NSArray *ary = @[@"我",@"是",@"张",@"小",@"倍",@"er"];
[ary enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"%ld,%@,%@",idx ,[ary objectAtIndex:idx],obj);
}];
6.
NSArray *ary = @[@"我",@"是",@"张",@"小",@"倍",@"er"];
dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_apply([ary count],queue, ^(size_t index){
NSLog(@"%ld,%@",index,[ary objectAtIndex:index]);
});
数组是固定的哦,不能动态添加。需要动态添加的话请 改用 集合方式。 然后操作完成后再把集合转换成数组。
这个还是要看你的需要。如果这个数组需要在初始时有初始数据,这样你在初始时可以使用字面量或init方式来创建实例。如果不需要一开始就初始,也可以如这样的代码
NSArray *array = nil;
后面的逻辑中得到数据后再赋值
array = xxxx;
在ios开发的过程中,经常需要使数组中的数据倒叙排列!比如在tableView显示数据的时候需要使数据倒序排列!那么如何解决数组的倒序排列问题呢?好多开发的小伙伴可能是便利数组的下标来获取,但是这种方法如果数据很大的情况下程序体验度会降低 , 这里介绍一个方法,一句话便可以搞定数组的倒序排序问题!
sortedArrayUsingSelector
按Key值大小对NSDictionary排序
sortedArrayUsingSelector
sortedArrayUsingComparator
sortedArrayUsingDescriptors sortUsingDescriptors
前者带返回值,是NSArray的方法,排好序的数组是返回值中的数组;
后者不带返回值,是NSMutableArray的方法,是对当前数组自己排序
接下来根据一个对象的属性,排列这个对象
.h
.m
排序方法的实现
这里的NSArray中的第一元素表示首先按照这个元素的升序或者降序进行排序,对于有重复项的,再按照第二元素进行排序,依次进行类推
转自: