iOS开发常用技巧之Objective-C

一、使用for循环

objective-c语言要遍历字典、数组或者是集合,for循环是最简单也用的比较多的方法,示例如下:

//普通的for循环遍历

-(void)iteratorWithFor

{

//////////处理数组//////////

NSArray *arrayM = @[@"1",@"2",@"3",@"4"];

NSInteger arrayMCount = [arrayM count];

for (int i = 0; i<arrayMCount; i++) {

NSString *obj = arrayM[i];

NSLog(@"%@",obj);

}

//////////处理字典//////////

NSDictionary *dictM = @{@"1":@"one",@"2":@"two",@"3":@"three"};

NSArray *dictKeysArray = [dictM allKeys];

for (int i = 0; i<dictKeysArray.count; i++) {

NSString *key = dictKeysArray[i];

NSString *obj = [dictM objectForKey:key];

NSLog(@"%@:%@",key,obj);

}

//////////处理集合//////////

NSSet * setM = [[NSSet alloc] initWithObjects:@"one",@"two",@"three",@"four", nil];

NSArray *setObjArray = [setM allObjects];

for (int i = 0; i<setObjArray.count; i++) {

NSString *obj = setObjArray[i];

NSLog(@"%@",obj);

}

//////////反向遍历----降序遍历----以数组为例

NSArray *arrayM2 = @[@"1",@"2",@"3",@"4"];

NSInteger arrayMCount2 = [arrayM2 count] - 1;

for (NSInteger i = arrayMCount2; i>0; i--) {

NSString *obj = arrayM2[i];

NSLog(@"%@",obj);

}

}

优点:简单

缺点:由于字典和集合内部是无序的,导致我们在遍历字典和集合的时候需要借助一个新的『数组』作为中介来处理,多出了一部分开销。

二、使用NSEnumerator遍历

NSEnumerator的使用和基本的for循环类似,不过代码量要大一些。示例如下:

//使用NSEnumerator遍历

-(void)iteratorWithEnumerator

{

//////////处理数组//////////

NSArray *arrayM = @[@"1",@"2",@"3",@"4"];

NSEnumerator *arrayEnumerator = [arrayM objectEnumerator];

NSString *obj;

while ((obj = [arrayEnumerator nextObject]) != nil) {

NSLog(@"%@",obj);

}

//////////处理字典//////////

NSDictionary *dictM = @{@"1":@"one",@"2":@"two",@"3":@"three"};

NSEnumerator *dictEnumerator = [dictM keyEnumerator];

NSString *key;

while ((key = [dictEnumerator nextObject]) != nil) {

NSString *obj = dictM[key];

NSLog(@"%@",obj);

}

//////////处理集合//////////

NSSet * setM = [[NSSet alloc] initWithObjects:@"one",@"two",@"three",@"four", nil];

NSEnumerator *setEnumerator = [setM objectEnumerator];

NSString *setObj;

while ((setObj = [setEnumerator nextObject]) != nil) {

NSLog(@"%@",setObj);

}

//////////反向遍历----降序遍历----以数组为例

NSArray *arrayM2 = @[@"1",@"2",@"3",@"4"];

NSEnumerator *arrayEnumerator2 = [arrayM2 reverseObjectEnumerator];

NSString *obj2;

while ((obj2 = [arrayEnumerator2 nextObject]) != nil) {

NSLog(@"%@",obj2);

}

}

优点:对于不同的数据类型,遍历的语法相似;内部可以简单的通过reverseObjectEnumerator设置进行反向遍历。

缺点:代码量稍大。

三、使用for...In遍历

在Objective-C 2.0 中增加了for ...In 形式的快速遍历。此种遍历方式语法简洁,速度飞快。示例如下:

//使用for...In进行快速遍历

-(void)iteratorWithForIn

{

//////////处理数组//////////

NSArray *arrayM = @[@"1",@"2",@"3",@"4"];

for (id obj in arrayM) {

NSLog(@"%@",obj);

}

//////////处理字典//////////

NSDictionary *dictM = @{@"1":@"one",@"2":@"two",@"3":@"three"};

for (id obj in dictM) {

NSLog(@"%@",dictM[obj]);

}

//////////处理集合//////////

NSSet * setM = [[NSSet alloc] initWithObjects:@"one",@"two",@"three",@"four", nil];

for (id obj in setM) {

NSLog(@"%@",obj);

}

//////////反向遍历----降序遍历----以数组为例

NSArray *arrayM2 = @[@"1",@"2",@"3",@"4"];

for (id obj in [arrayM2 reverseObjectEnumerator]) {

NSLog(@"%@",obj);

}

}

优点:1)语法简洁;2)效率最高;

缺点:无法获得当前遍历操作所针对的下标。

四、基于Block的遍历方式

基于Block的方式来进行遍历是最新引入的方法。它提供了遍历数组|字典等类型数据的最佳实践。示例如下:

//基于块(block)的遍历方式

-(void)iteratorWithBlock

{

//////////处理数组//////////

NSArray *arrayM = @[@"1",@"2",@"3",@"4"];

[arrayM enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

NSLog(@"%zd--%@",idx,obj);

}];

//////////处理字典//////////

NSDictionary *dictM = @{@"1":@"one",@"2":@"two",@"3":@"three"};

[dictM enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {

NSLog(@"%@:%@",key,obj);

}];

//////////处理集合//////////

NSSet * setM = [[NSSet alloc] initWithObjects:@"one",@"two",@"three",@"four", nil];

[setM enumerateObjectsUsingBlock:^(id  _Nonnull obj, BOOL * _Nonnull stop) {

NSLog(@"%@",obj);

}];

//////////反向遍历----降序遍历----以数组为例

NSArray *arrayM2 = @[@"1",@"2",@"3",@"4"];

[arrayM2 enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

NSLog(@"%zd--%@",idx,obj);

}];

}

优点:1)遍历时可以直接从block中获得需要的所有信息,包括下标、值等。特别相对于字典而言,不需要做多余的编码即可同时获得key和value的值。

2)能够直接修改block中key或者obj的类型为真实类型,可以省去类型转换的工作。

3)可以通过NSEnumerationConcurrent枚举值开启并发迭代功能。

说明:基于Block的遍历方式在实现反向遍历的时候也非常简单,使用enumerateObjectsWithOptions方法,传递NSEnumerationReverse作为参数即可,在处理遍历操作的时候推荐基于Block的遍历方式。

五、使GCD中的dispatch_apply函数

使用GCD中的dispatch_apply函数也能实现字典、数组等的遍历,该函数比较适合处理耗时较长、迭代次数较多的情况。示例如下:

//使用GCD中的dispatch_apply函数

-(void)iteratorWithApply

{

//////////处理数组//////////

NSArray *arrayM = @[@"1",@"2",@"3",@"4"];

//获得全局并发队列

dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

dispatch_apply(arrayM.count, queue, ^(size_t index) {

NSLog(@"%@--%@",arrayM[index],[NSThread currentThread]);

});

}

优点:开启多条线程并发处理遍历任务,执行效率高。

缺点:1)对于字典和集合的处理需借助数组;2)无法实现反向遍历。

原文来自:博客园

时间: 2024-10-24 23:42:18

iOS开发常用技巧之Objective-C的相关文章

iOS开发--常用技巧 (MJRefresh详解)

转载的mj的  原版地址 https://github.com/CoderMJLee/MJRefresh 下拉刷新01-默认 self.tableView.header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{ // 进入刷新状态后会自动调用这个block }]; 或 // 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadNewData方法) self.tableView.header =

HTML5-移动开发常用技巧与弹性布局的使用

一.移动开发常用技巧 Viewport基本知识 设置布局Viewport的各种信息 1.width=device-width: 设置Viewport视口宽度等于设备宽度 2.initial-scale=1: 网页默认缩放比为1(网页在手持设备上,不会进行默认缩放 3.minimum-scale=1 网页最小缩放比为1 4.maximum-scale=1 网页最小大缩放比为1 5.user-scalable=no 禁止用户手动缩放网页(ios10+ 的设备失效) 在手机站及响应式网站的制作中,网页

iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式

iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式 说明: 1)该文简短介绍在iOS开发中遍历字典.数组和集合的几种常见方式. 2)该文对应的代码可以在下面的地址获得:https://github.com/HanGangAndHanMeimei/Code 一.使用for循环 要遍历字典.数组或者是集合,for循环是最简单也用的比较多的方法,示例如下: 1 //普通的for循环遍历 2 -(void)iteratorWithFor 3 { 4 //////////处理数组/////

iOS开发-常用第三方开源框架介绍(你了解的ios只是冰山一角)

iOS开发-常用第三方开源框架介绍(你了解的ios只是冰山一角) 2015-04-05 15:25 2482人阅读 评论(1) 收藏 举报开源框架 图像: 1.图片浏览控件MWPhotoBrowser       实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网络下载图片并进行缓存.可对图片进行缩放等操作.      下载:https://github.com/mwaterfall/MWPhotoBrowser目前比较活跃的社区仍旧是Github,

IOS开发常用设计模式

IOS开发常用设计模式 说起设计模式,感觉自己把握不了笔头,所以单拿出iOS开发中的几种常用设计模式谈一下. 单例模式(Singleton) 概念:整个应用或系统只能有该类的一个实例 在iOS开发我们经常碰到只需要某类一个实例的情况,最常见的莫过于对硬件参数的访问类,比如UIAccelerometer.这个类可以帮助我们获得硬件在各个方向轴上的加速度,但是我们仅仅需要它的一个实例就够了,再多,只会浪费内存. 所以苹果提供了一个UIAccelerometer的实例化方法+sharedAcceler

iOS开发-常用第三方开源框架介绍

iOS开发-常用第三方开源框架介绍 图像: 1.图片浏览控件MWPhotoBrowser 实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网络下载图片并进行缓存.可对图片进行缩放等操作. 下载:https://github.com/mwaterfall/MWPhotoBrowser 目前比较活跃的社区仍旧是Github,除此以外也有一些不错的库散落在Google Code.SourceForge等地方.由于Github社区太过主流,这里主要介绍一下G

ios开发小技巧-用宏化简代码

在IOS开发中,要做字典转模型一般情况如下: 1 /** 2 * 声明方法 3 */ 4 - (instancetype) initWithDictionary:(NSDictionary *)dict; 5 + (instancetype) carWithDictionary:(NSDictionary *)dict; 6 7 /** 8 * 实现方法 9 */ 10 - (instancetype)initWithDictionary:(NSDictionary *)dict 11 { 12

iOS 开发常用的一些工具

http://www.itjhwd.com/ios-tool/ 通用工具 HomeBrew:OS X上非常出色的包管理工具. 源码控制 Git:分布式版本控制系统和源码管理系统,其优点是:快和简单易用.对于新手来说,可在此查看免费电子书籍. GitHub:声望日盛的资源分享之地. BitBucket:GitHub的替代选择. GitHub for Mac:一个设计的非常美观的git客户端,不能取代你从命令行获得的所有功能,但使用起来非常简单. SourceTree:Windows和Mac上免费

iOS开发实用技巧—项目新特性页面的处理

iOS开发实用技巧篇—项目新特性页面的处理 说明:本文主要说明在项目开发中会涉及到的最最简单的新特性界面(实用UIScrollView展示多张图片的轮播)的处理. 代码示例: 新建一个专门的处理新特性界面的控制器,可以实用代码也可以用xib,在这里实用纯代码方式,创建一个控制器NewfeatureViewController. 头文件代码: 1 // 2 // JMNewfeatureViewController.h 3 // 4 5 #import <UIKit/UIKit.h> 6 7 t