在开发过程中,经常会用到NSArray,然后找出数组中的最大值、最小值,很多时候我们一般用for循环来封装一个算法求最值,虽然可以但是还是不够快速。其实Apple底层可我们封装了一个十分好用的API,可以通过valueForKeyPath方法来设置你想要获取的一些数组。
创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都做网站、成都网站设计、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的鹿城网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
NSMutableArray* array = [NSMutableArray array];
for (int i = 0; i 10; i++) {
CGFloat num = arc4random() % 100 + 1;
[array addObject:[NSNumber numberWithFloat:num]];
}
CGFloat maxValue = [[array valueForKeyPath:@"@max.floatValue"] floatValue];
CGFloat minValue = [[array valueForKeyPath:@"@min.floatValue"] floatValue];
min、max是NSArray的私有属性,通过.语法是拿不到的,会报错的。类似这种私有属性还有
@”@avg.floatValue” (获取平均值),
@”@count.floatValue”(获取数组大小)
@"@sum.floatValue"(求和)
还可以去重
NSArray *array = @[@"a", @"wechat", @"qq", @"msn", @"wechat"];
NSArray *deleltNewA = [array valueForKeyPath:@"@distinctUnionOfObjects.self"];
在开发过程中很多App为了美观经常需要使用一些自定义的字体,其实苹果本身也是支持很多字体的,下面就记录一下查看所有字体并设置的方法,其实挺简单的。
知道设置字体的方法了,就需要找出苹果本身支持的所有字体了,一个for循环就可以搞定了。
下面是所有的效果,可以在下面直接找需要的字体
不过发现这些效果对中文好像没什么效果,这就需要自定义字体了
1.将准备好的字体拉入项目中
2.打开Build Phases—Copy Bundle Resources,确保刚添加的字体文件在列表中,否则需要手动加到这里
3.编辑”项目名-Info.plist”文件
找到Fonts provided by application ,将加入的字体名连同扩展名填在这里
4.利用上面那个for循环打印出所有字体,并找到刚刚加入的字体
5.现在就可以使用了[UIFont fontWithName:@"chenweixun-yingxing" size:16];
用循环语法
这个添加属于动态添加,需要用这个数组 nsmutablearray 具体用法。百度一下。
-- :表示弱引用。
- :表示强引用。
循环引用可以简单理解为对象A引用了对象B,而对象B又引用了对象A:A - B - A,此时双方都同时保持对方的一个引用,导致任何时候双方的引用计数都不为0,双方始终无法释放就造成内存泄漏。
当然不只是两个对象之间相互引用会形成循环引用,多个对象之间相互引用最终形成环同样会形成循环引用。
例如:A-B-C-....-X-B。
循环引用对 app 有潜在的危害,会使内存消耗过高,导致内存泄漏,性能变差和 app 闪退等。
block 、 delegate 、NSTimer
self.tableView.delegate = self;
如果 delegate使用strong修饰就会构成循环引用:self - tableView - delegate - self。
所以在定义delegate属性时使用weak便能解决这一问题:self - tableView -- delegate - self。tableView和delegate之间不是强引用,所以构不成循环。
规避delegate循环引用的杀手锏也是简单到哭:定义delegate属性时请用assign(MRC)或者weak(ARC),千万别手贱玩一下retain或者strong。
(1)并不是所有block都会产生循环引用,block是否产生循环引用是需要我们去判断的,例如
(2)self - reachabilityManager - block - self,才会产生循环引用,并且XCode给出了循环引用warning,例如
(3)解决block循环引用的方法是使用__weak修饰self,然后在block里使用被修饰后的weakSelf来代替self:
1、合适的时机启动和销毁 NSTimer
解决 NSTimer 的循环引用,我们首先会想到的方法应该是在 OneViewController dealloc 之前就销毁 NSTimer,这样循环就被打破了。
最简单的方法就是在 viewWillAppear 中启动 NSTimer,然后在 viewWillDisappear 中销毁 NSTimer,成对出现,绝对没有问题。
2、Effective Objective-C ”中的52条方法
计时器保留其目标对象,反复执行任务导致的循环,确实要注意,另外在dealloc的时候,不要忘了调用计时器中的 invalidate方法。
for循环的话主要分为两种,一种是你说的三个条件的,用索引来遍历对象(List,数组,Dictionary等等);另一种就是图上这种for(var i in Object),这种就是直接遍历Object下的子元素集合了,范围自然默认为集合的容量了,也就不需要其他条件了