- 博客(46)
- 资源 (2)
- 收藏
- 关注
原创 Dart基本语法
Dart基本语法本篇是针对iOS开发者写Dart基础语法总结,主要通过对比OC和Swift来讲解Dart的基础语法,一些普通语法不再讲解1.重要概念在学习Dart的时候,请牢记下面一些事实和概念:所有能够使用变量引用的都是对象, 每个对象都是一个类的实例。在Dart中甚至连数字、方法和null都是对象。所有的对象都继承于Object类。使用静态类型(例如前面示例中的num) 可以...
2019-08-22 23:13:40
704
原创 iOS组件化——源码与二进制的平滑切换
背景刚加入新的公司,接触到新公司的代码以后,心中是一篇翻江倒海,不是因为项目代码有多优秀,多牛逼,而是因为这是一个7年的老项目,期间经历过不知多少个程序员的手,项目简直是面目全非,各种重复的第三方库,代码耦合严重,不同时期的代码风格及开发模式完全不一样,造成项目过大,编译花费很多时间。现在的同事们正在想办法优化项目,在使用组件化的发开模式,减少与项目中老代码及第三方重复库的耦合。因此,一些老的...
2018-07-21 18:07:36
3290
2
原创 swift Codable的使用及简单封装
swift在4.0之前,一直没有一套数据解析的方法。现在4.0后,终于有了Codable可以直接将json转成对象,有望取代OC的KVC机制。 先来看看Codablepublic typealias Codable = Decodable & Encodable 基本使用它和NSCoding很像,可以重写decoder和encoder。基本的使用很简单class Pe
2018-01-08 17:10:26
10396
2
原创 Swift泛型在协议中的使用
protocol TestProtocol { associatedtype TestElement func run(_ param: TestElement)}class TestObject: TestProtocol { typealias TestElement = Int func run(_ param: Int) {
2017-09-06 14:47:15
1288
原创 Swift通过协议实现AOP
什么是AOPAOP是OOP的延续,是(Aspect Oriented Programming)的缩写,意思是面向切面编程,是目前软件开发中的一个热点。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 。 主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等。 主要的意图
2017-08-25 15:17:12
3739
原创 Swift中performSelector返回值的用法
最近使用swift,翻译OC的代码时,发现performSelector的返回值与OC中的用法相差很大。在OC中返回的是ID类型,而swift中返回的是 Unmanaged! 类型,见下图。在以前OC中,使用performSelector,直接接受返回值,然后转成需要的类型进行操作就可以了,但是在swift中是不行的,下面是按OC直接翻译成swift的代码,基本原理是target-ac
2017-08-09 15:30:02
7897
原创 今天开始用swift写服务器(三)
今天将会带来一个有关登录注册的demo,并且继续在上篇的基础上开发。通过注册登录功能,来讲讲数据库连接工具的封装使用和初步了解redis的连接工具。
2017-05-28 10:22:38
1921
原创 今天开始用swift写服务器(二)
上篇已经初步讲解了怎么使用perfect开启一个服务,本篇主要讲使用prefect如何从数据库中查询数据,并以JSON格式通过接口给客户端。下面的例子以一个APP端列表为例,数据库使用的是MySQL,运行环境MacOS,实现了分页加载。(客户端视觉比较烂,主要为了实现功能)首先给大家看一下数据库中的数据为了是项目可以连接MySQL,需要在Package.sw
2017-05-16 21:47:27
2595
原创 使用Swift Package Manager管理项目
今天来讲讲swift的代码资源库管理工具——Swift Package Manager,下面简称SPM。并对上一篇今天开始写swift服务器(一)做一些关于项目管理上的纠正。上篇讲到,因为SPM管理,如果source文件中发生变动,会造成无法正常更新或添加库或框架的问题,故使用workspace管理项目。但是,使用workspace管理,会出现部分C语言的库无法链接的问题,可能本人能力有限,没有找
2017-04-19 15:45:54
5860
原创 今天开始用swift写服务器(一)
用swift写服务器的已经不是什么新鲜事了,这几年的发展,也是swift在服务端的表现越来越成熟,目前比较流行服务端框架主要有Vapor、Perfect、Kitura和Zewo,他们各有长短,本人这次主要是使用Perfect来写的,因为Perfect的功能比较完善,在GitHub上具有1W+的星,而且有一个非常重要的原因是,Perfect有中文文档。Perfect 包括了您所期待的所有基本功能
2017-04-13 18:48:53
10817
6
原创 利用函数式编程和链式编程封装富文本
现在APP的开发中,UI为了是页面更加漂亮,文字更加饱满,经常会出现使用到富文本的场景。在实际开发中,富文本(NSAttributedString)在写代码时非常麻烦。针对不同范围内的文字,添加不同的富文本属性,可能只是短短几行文字,却要通过几十行甚至上百行代码去实现。比如这样NSMutableAttributedString *AttributedStr = [[NSMutableAttrib
2017-03-07 23:33:54
880
原创 使用AFNetworking3.0实现接口异步并发
近两个月,因为团队后台的动荡,项目新版本的接口非常乱,出现一个tableView需要几个接口来获取数据源的情况。这就需要在几个接口并发请求完后一起回调处理。因为项目中使用的是AFN的网络框架,所以,这个需求只能基于AFN去实现一般,我们在使用AFN的网络请求时,是利用- (NSURLSessionDataTask *)POST:(NSString *)URLString
2016-08-24 17:52:10
6129
原创 @synchronized 锁用法
synchronized 这个主要是考虑多线程的程序,这个指令可以将{ } 内的代码限制在一个线程执行,如果某个线程没有执行完,其他的线程如果需要执行就得等着。Objective-C支持程序中的多线程。这就意味着两个线程有可能同时修改同一个对象,这将在程序中导致严重的问题。为了避免这种多个线程同时执行同一段代码的情况,Objective-C提供了@synchronized()指令。
2016-08-02 15:16:26
475
原创 iOS与JaveScript的交互
iOS的webView与H5中的JS交互在UIWebView中,OC调JS,这里使用JavaScriptCore这个框架;多余代码就不写了,只写关键代码,在UIWebView的代理方法-(void)webViewDidFinishLoad:(UIWebView *)webView中实现。-(void)webViewDidFinishLoad:(UIWebView *)webView
2016-07-28 21:22:14
502
原创 GCD定时器
在上一篇关于RunLoop的文章中,定时器是需要在开启runloop的线程中才能工作。但是,runloop是一直在循环运行,监听所有的source,timer和selector的。所以,在运行定时器的时候,runloop可能还需要处理其他事件,因此会造成定时器的一些误差,如果我们想让定时器脱离runloop,那么,这里有一种GCD的定时器可以使用,话不多少,直接上代码,已经写好详细注释:@in
2016-04-26 09:53:33
520
原创 RunLoop浅谈
一、什么是RunLoop运行循环,基本作用:保持程序的持续运行,处理App中的各种事件(比如触摸事件、定时器事件、selector事件),节省CUP资源,提高程序性能,即该做事时做事,该休息时休息。RunLoop在运行时只能选择一种模式。二、在Core Foundation中RunLoop有5个类:1.CFRunLoopRef2.CFRunLoopM
2016-04-25 17:57:50
502
原创 NSException异常处理
当我们的项目上线后,想收集用户的崩溃信息主要有两种方式,一种是借第三方平台的统计,还有一种就是自己统计,上传服务器。这里就讲讲自己使用NSException统计崩溃信息。在main.m中 @try { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromCl
2016-04-25 17:28:32
2215
原创 iOS编程思想
一、链式编程通过点语法,将所有的方法串联,返回所需要的结果,即 结果 = 对象.方法.方法.方法。这样会是代码更加易读,甚至看起来像swift的语法。Test * test = [[Test alloc] init]; int sum = test.add(10).add(20).result; NSLog(@"%d", sum); 结果 sum=30
2016-04-19 13:44:05
419
原创 HTML及CSS基础
一、网页的组成,3个部分组成: 1.HTML 网页的具体内容和结构 2.CSS 网页的样式 3.JavaScript 网页交互效果和响应事件二、结构性标签 1.article:文章主题内容(一篇博客、一篇论坛帖子、一段用户评论、插件) 2.header:标记头部区域内容 3.
2016-04-15 16:34:33
439
原创 iOS学习笔记--瀑布流封装
最近学习了瀑布流布局,是用collectionView实现的。首先说说设计思路,用collectionView做出来的瀑布流是固定行数或者列数的。以现在主流固定列数为例,每个item就是固定宽,不固定高,同时每个item之间的间距是固定的,那么每行的Y值计算就需要通过前一行的最短的item来确定。既然是用collectionView实现,而collectionView的布局是通过他的layou
2016-04-07 11:01:47
466
原创 iOS 图片模糊处理和自动获取图片尺寸
1.图片模糊处理:方法一:+ (UIImage *)coreBlurImage:(UIImage *)image withBlurNumber:(CGFloat)blur { CIContext *context = [CIContext contextWithOptions:nil]; CIImage *inputImage=[CIIma
2016-03-25 16:20:28
1031
1
原创 Runtime学习笔记(一)——成员变量和属性
最近开始学习runtime,想挖掘iOS的运行机制,经过几天折腾,终于初窥门径,首先记录关于成员变量和属性的学习内容1.获取成员变量Ivar: 实例变量类型,是一个指向objc_ivar结构体的指针 typedef struct objc_ivar *Ivar;model的声明:#import @interface Model : NSObject{
2016-03-24 14:46:49
441
原创 tableview的代理分离,帮助控制瘦身
刚刚看了一个关于iOS设计模式的文章,里面提到了tableView代理分离的一种控制器瘦身模式,也可以理解为MVVM模式的一部分,参考点击打开链接。这里我先简单的将一下这分离过程。先创建一个代理类.h文件#import #import typedef void(^SelectCell)(NSIndexPath * indexPath);@interface TableVi
2016-03-17 14:04:04
811
原创 代理传值iOS9与之前版本的区别——提前释放
这几天,项目第一阶段进入收尾和测试阶段了,之前测试时,所有的设备都是iOS9的,这次用iOS8测试时,自定义封装的弹出框出现了响应代理事件和代理传值时崩溃的情况,用iOS7也是这样。首先,我检查了代码,发现没有iOS9以后的代码,说明代码的版本兼容本身是没有问题。先上一段代码:自定义弹出框.h文件#import typedef NS_ENUM(NSInteger, AlertSta
2016-03-11 13:56:21
1160
原创 NSURLSession实现图片下载
本文主要介绍使用NSURLSession来实现图片下载,分别是带缓存的下载和无缓存下载1.带缓存下载 NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[self preventNotRecognizedCharactersWithUrl:url]] cac
2016-02-04 13:22:54
1112
原创 NSTimer在tableView中的复用问题
之前,有位朋友,在写商品倒计时是,因为定时器在tableview上总是被复用,使改界面拖延了很久,最好找我写了个demo才解决。之后,还有不少iOS的朋友遇到类似复用的问题。这里只讲我这个demo中的关键代码及对复用的理解,demo的下载链接在文章最后。(如有不足请提出)首先讲讲tableview的复用:cell在创建的时候,只会创建设备屏幕可见的cell个数,而不是按照你的数据源中的
2016-02-03 10:02:04
1237
原创 NSURLSession的POST请求及封装
刚简单的学习了一下NSURLSession,于是对NSURLSession进行了简单的POST请求封装,有什么不足的请提出,也希望对别人有所帮助
2016-02-02 16:41:30
550
原创 关于MBProgressHUD自定义帧动画
现在很多APP的HUD已经都是自定义动画了,MBProgressHUD没有开放的API可以让我们直接使用,需要到.m文件中去修改源码。首先在.m文件中找到- (void)updateIndicators方法在if (mode == MBProgressHUDModeIndeterminate) {}中自定义动画,然后上代码:if (mode == MBP
2016-01-29 09:29:41
5422
4
原创 swift学习及感受
之前的博文都是我自己在学习swift时的笔记,在参考学习资料(点击打开链接)的前提下,加上了一些自己的理解。希望对于初学swift的朋友有点帮助。因为参考的资料是1.2版本的,部分不可用代码已经修改成2.0的了但是本人基础比较薄弱,还有部分知识点不是很理解,需要今后继续深入学习。在学习过程中,发现swift是一门集合现代很多语言有点的一门语言,使开发更加精简,逻辑更加清
2016-01-22 09:57:17
469
原创 swift泛型
/**1.泛型所解决的问题2.泛型函数3.类型参数4.命名类型参数5.泛型类型6.类型约束7.关联类型8.where语句泛型代码可以让你写出根据自我需要定义、适用于任何类型的,灵活且可重用的函数和类型。可以避免重复的代码,用一种清晰和抽象方式来表达代码的意图泛型是swift强大特征中的其中一个,许多swift标准库是通
2016-01-22 09:43:36
387
原创 swift协议
/**1.协议的语法2.属性要求3.方法要求4.突变方法要求5.协议类型6.委托代理模式7.在扩展中添加协议成员8.通过延展补充协议声明9.集合中的协议类型10.协议的继承11.协议合成12.检验协议的一致性13.可选协议要求Protocol(协议)用于统一方法和属性的名称,而不实现任何
2016-01-22 09:41:25
425
原创 swift类型扩展
/**1.扩展语法2.计算型属性3.构造器4.方法5.下标6.嵌套类型扩展就是向一个已有的类、结构体或枚举类型添加新功能。包括在没有权限获取原始源代码的情况下扩展类型的能力(即逆向建模)。扩展和OC中的分类(category)类似。不过与OC不同的是,swift的扩展没有名字。如果定义一个扩展向已有类型添加新功能,那么这个心功能对该类
2016-01-22 09:39:32
504
原创 swift类型嵌套
/**1.类型嵌套实例2.类型嵌套引用枚举类型常被用于实现特定类或结构体的功能。也能够在有多种变量类型的环境中,方便地定义通用类或结构体来使用,为了实现这种功能,swift允许你定义类型嵌套,可以在枚举类型、类和结构体中定义支持嵌套类型要在一个类型中嵌套另一个类型,将需要嵌套的类型的定义写在被嵌套类型的区域{}内,而且可以根据需要定义多级嵌套*/
2016-01-22 09:38:26
637
原创 swift类型检查
/**1.定义一个类层次作为例子2.检查类型3.向下转型(Downcasting)4.Any和AnyObject的类型检查类型检查是一种检查类实例的方式,并且或者也是让实例作为它的父类或者子类的一种方式类型检查在swift中使用is和as操作符实现,这连个操作符提供了一种简单达意的方式去检查值的类型或者转换它的类型也可以用来检查一类是够实现了
2016-01-22 09:37:05
632
原创 swift可选链
/**1.可选链可替代强制解析2.为可选链定义模型类3.通过可选链调用属性4.通过可选链调用方法5.使用可选链调用子脚本6.连接多层链接7.链接自判断返回值的方法可选链是一种可以请求和调用属性、方法及子脚本的过程,它的自判断性体现于请求或调用的目标当前可能为空(nil)。如果自判断的目标有值,那么调用就会成功;相反,如果选择的目标为空
2016-01-22 09:32:14
443
原创 swift自动引用计数
/**在少数情况下,ARC为了能帮助你管理内存,需要更多的关于你的代码之间关系的信息引用计数仅仅应用于类的实例,结构体和枚举类型是值类型,不是引用类型,也不是通过引用的方式存储和传递为了使之成为可能,无论你将实例赋值给属性,常量或者是变量,属性,常量或者变量,都会对此实例创建强引用。之所以称之为强引用,是因为它会将实例牢牢的保持住,只要强引用还在,实例是不允许被销毁的
2016-01-22 09:30:37
400
原创 swift析构过程
/**1.析构过程原理2.析构函数操作在一个类的实例被释放之前,析构函数被立即调用,用关键字deinit来标示析构函数,类似于初始化函数用init来标示。析构函数只适用于类类型*//**deinit { // 执 析构过程}*/struct Bank { st
2016-01-22 09:29:05
478
原创 swift构造过程
/**1.存储型属性的初始赋值2.定制化构造过程3.默认构造器4.值类型的构造代理5.类的继承和构造过程6.通过闭包和函数来设置属性的默认值与OC不同,swift的构造器无需返回值*///存储型属性的初始赋值/**为存储型属性设置默认值或者在构造器中为其赋值时,它们的值是被直接设置的,不会触发任何属
2016-01-22 09:27:09
615
原创 swift继承
/**1.定义一个基类2.子类生成3.重写4.防止重写一个类可以继承另一个类的方法,属性和其他特性,在swift中,继承是区分类与其他类型的一个基本特征类可以调用和访问父类的方法,属性和附属脚本,并且可以重写这些方法,属性和附属脚本来优化或修改它们的行为。也可以为类中继承来的属性添加属性观察器*/
2016-01-22 09:24:58
404
原创 swift附属脚本
/**1.附属脚本语法2.附属脚本用法3.附属脚本选项*///附属脚本/**附属脚本可以定义在类、结构体和枚举这些目标中,可以认为是访问对象、集合或序列的快捷方式,不需要再调用实例的特定的赋值和访问方法。对于同一个目标可以定义多个附属脚本,通过索引值类型的不同来进行重载,并且索引值的个数可以是多个*/
2016-01-21 14:19:42
559
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人