iOS开发常用细节

前言

github:https://github.com/koknine

(求star,follow ^_^)

之前总结分享的内容在实际 iOS 开发过程中都能起到一定的辅助,那么本篇文章就着重归类一些平时开发常用的代码模块部分,那种经常使用但容易出错或者漏掉细节的内容。除此之外,还有一些优化方法的归纳,特别是UITableView,使用频率相当高。

内容慢慢添加,涉及的可能会很多,写这些的目的是为了提醒自己,不要在一些细节上弄出问题。

iOS 开发优化

很好的文章,iOS开发性能调优

http://blog.csdn.net/linzhiji/article/details/8792930

多线程

多线程开发在 iOS 开发中是非常强大而且能提升性能的手段,特别是在网络请求部分,结合 block 使用,不仅要考虑到线程问题,还有 block 块的循环引用,所以必须要特别强调,时刻提醒自己。

block 相关

使用copy修饰属性

想不循环应用,那么在 block 外面这样声明

__weak__typeof(self)weakSelf =self;

接着,在 block 里面这样

__strong__typeof(weakSelf)strongSelf = weakSelf;

这样既防止循环应用,又避免 block 内部 self 会无效的可能

AFNetworking里面这样使用的很多

GCD

异步请求,我只认准 GCD | GCD异步,你值得拥有 (广告先走一波)

网络请求放在子线程,UI 只能在主线程更新

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^(void) {// 处理各种耗时间的事情,比如网络请求数据,天知道要什么时候才能结束dispatch_async(dispatch_get_main_queue(), ^(void) {// 好了以后,我们回到主线程进行界面刷新});});

只执行一次

Xcode 自带的代码块

staticdispatch_once_tonceToken;dispatch_once(&onceToken, ^{    });

延迟执行

Xcode 自带的代码块

doubledelaySeconds =5.0;dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delaySeconds * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{    });

创建队列

dispatch_queue_tbaidu_queue = dispatch_queue_create("baidu.com",NULL);dispatch_async(baidu_queue, ^{NSLog(@"开启异步任务");});dispatch_sync(baidu_queue, ^{NSLog(@"开启同步任务");});//----------------------------------//执行10次,每次执行都开新进程,所以顺序不一定dispatch_apply(10, DISPATCH_QUEUE_PRIORITY_DEFAULT, ^(size_t index) {NSLog(@"index = %ld",index);}); /-----------------------------------

任务组

// 多个任务(在多个线程)同时执行,等他们完成以后,再执行其他任务//先建立一个分组,多个任务形成一个组,在组里面的任务完成以后再执行后续的任务dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);dispatch_group_tgroup= dispatch_group_create();dispatch_group_async(group, queue, ^{    NSLog(@"1");});dispatch_group_async(group, queue, ^{    NSLog(@"2");});dispatch_group_async(group, queue, ^{    NSLog(@"3");});dispatch_group_async(group, queue, ^{    NSLog(@"4");});dispatch_group_async(group, queue, ^{    NSLog(@"5");});dispatch_group_notify(group, dispatch_get_main_queue(), ^{    NSLog(@"主线程");});

NSOperation

UIKit

UIView 相关

- (void)setNeedsLayout;

调用layoutSubviews方法

- (void)setNeedsDisplay;

调用drawRect方法

新特性

版本更新或者第一次下载,我们都要看的页面,对 app 的初步介绍

https://github.com/nsdictionary/CoreNewFeatureVC

侧滑菜单

https://github.com/romaonthego/RESideMenu

图片浏览器

点击一张图片,全屏浏览,背景为黑色

https://github.com/mwaterfall/MWPhotoBrowser

HUD

有两个非常好用

SVProgressHUD

https://github.com/TransitApp/SVProgressHUD

MBProgressHUD

https://github.com/jdg/MBProgressHUD

UILabel

非常高能,支持各种富文本

https://github.com/TTTAttributedLabel/TTTAttributedLabel

UINavigationBar

向上滑动的时候,UINavigationBar会跟随滚动消失,反之会显示

https://github.com/andreamazz/AMScrollingNavbar

http://old.code4app.com/ios/XHYScrollingNavBarViewController/531d5768933bf0a83e8b6ac0

可伸缩的头部视图

http://www.cocoachina.com/bbs/read.php?tid=288489

UITableView 的优化

最基本的,cell 重用机制,如果这个都不知道的话,那可以去撞墙了。。。

异步加载数据,这个也是很基本的

自动载入更新数据,比如每次载入20条信息,然后在滚动到最后5条信息,就加载更多的信息

图片下载完成以后,判断 cell 如果是可见的,那么就需要更新图像

UIPasteboard 粘贴板

UITextView,UITextField,UIWebView这三个控件自带复制功能,而UILabel和UIImageView需要手动修改,才有复制功能,这个时候用到UIPasteboard

相关地址:http://blog.csdn.net/chengwuli125/article/details/8588554

blur 模糊

VVBlurPresentation

https://github.com/onevcat/VVBlurPresentation

UIWebView

OC 与 javascript 之间的桥梁

https://github.com/marcuswestin/WebViewJavascriptBridge

KVO

facebook 出品,更安全的 KVO 调用方式

https://github.com/facebook/KVOController

数据持久化

沙盒

访问沙盒里面几个路径

//获取根目录NSString*homePath = NSHomeDirectory();NSLog(@"Home目录:%@",homePath);

//获取Documents文件夹目录NSArray*docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);NSString*documentsPath = [docPath objectAtIndex:0];NSLog(@"Documents目录:%@",documentsPath);

//获取Cache目录NSArray*cacPath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask,YES);NSString*cachePath = [cacPath objectAtIndex:0];NSLog(@"Cache目录:%@",cachePath);

//获取Library目录NSArray*libsPath = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask,YES);NSString*libPath = [libsPath objectAtIndex:0];NSLog(@"Library目录:%@",libPath);

//获取temp目录NSString*tempPath = NSTemporaryDirectory();NSLog(@"temp目录:%@",tempPath);

写入与读取

NSArray*testArray1 = @[@"1",@"2"];//documentsPath是前面创建的NSString*filePath = [documentsPath stringByAppendingPathComponent:@"testArray1.text"];//写入[testArray1 writeToFile:filePath atomically:YES];//读取NSArray*readTestArray1 = [NSArrayarrayWithContentsOfFile:filePath];

文件管理

//获取文件管理器NSFileManager*fileManager = [NSFileManagerdefaultManager];//文件目录名NSString*testDirectory = [documentsPath stringByAppendingPathComponent:@"ttttest"];//执行创建[fileManager createDirectoryAtPath:testDirectory withIntermediateDirectories:YESattributes:nilerror:nil];

在刚才创建的文件夹下继续写入内容

//在文件目录下继续写入的路径NSString*tPath = [testDirectory stringByAppendingPathComponent:@"t1.txt"];//要写入内容NSString*contentString =@"ready...";//执行写入[fileManager createFileAtPath:tPath contents:[contentString dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];

获取一个目录下面所有的子文件

//获取documents下面的所有文件,可以看到隐藏的内容NSArray*file = [fileManager subpathsOfDirectoryAtPath:documentsPath error:nil];NSLog(@"file%@",file);NSArray*file2 = [fileManager subpathsAtPath:documentsPath];NSLog(@"file2=%@",file2);

改变文件管理器所能操作的位置

//移到准备操作的目录下[fileManager changeCurrentDirectoryPath:[documentsPath stringByExpandingTildeInPath]];//创建文件NSString*fileName =@"newTest.txt";NSString*tString =@"ttttttt";[fileManager createFileAtPath:fileName contents:[tString dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];

删除文件

//接着上面,就一句话[fileManager removeItemAtPath:fileName error:nil];

归档与解档

遵循NSCoding协议,然后实现那两个协议方法

MJExtension可以快速实现,不用写恶心的代码

属性列表

NSUserDefault

记得存的时候同步一下,因为存储不是立即的

数据库

系统自带的 API 实在不好用,FMDB的封装性非常高,专注于写 sql 语句即可

https://github.com/ccgus/fmdb

(特别注意FMDB的多线程处理)

Core Data

同样,原生的内容复杂,Magical Record是很好的解决方案

https://github.com/magicalpanda/MagicalRecord

(新版本过期了一些方法)

原文:https://segmentfault.com/a/1190000003722059

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容