自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

KT的iOS开发小站

记录点滴成长~

  • 博客(84)
  • 资源 (4)
  • 收藏
  • 关注

原创 启用新域名bestswifter

告别2015,也要告别CSDN了。注册了一个新域名:bestswifter我的个人博客:bestswifter.com 我的简书博客:KtZhang 我的Github: https://github.com/649395594欢迎关注,欢迎交流还记得最初在QQ空间和新浪博客发表过一两篇技术文章,2015年初转到了CSDN。初来乍到,CSDN有以下几个特点顿时吸引了我:丰富的资源CSDN作为

2015-12-31 16:55:50 8516 24

原创 Advanced Swift中文版

《Advance Swift》是由objc.io出版的一本深入介绍Swift特性的书。目前,《Advance Swift》还没有完成,作者仅放出了预览版(2015.10.15),并且声明会在2015年底前写完。预览版和最终版有一些区别,我会先根据预览版翻译,等最终版放出后再及时更新。如果你发现文章有错别字、语义不通顺、翻译不当等问题,请及时留言或私信我,我们共同打造一个高质量的Swift专题。每篇

2015-12-13 14:21:29 5012 3

原创 大前端开发者需要了解的基础编译原理和语言知识

在我刚刚进入大学,从零开始学习 C 语言的时候,我就不断的从学长的口中听到一个又一个语言,比如 C++、Java、Python、JavaScript 这些大众的,也有 Lisp、Perl、Ruby 这些相对小众的。一般来说,当程序员讨论一门语言的时候,默认的上下文经常是:“用 xxx 语言来完成 xxx 任务”。所以一直困扰着的我的一个问题就是,为什么完成某个任务,一定要选择特定的语言,比如安卓开发

2017-06-24 22:35:32 3703 9

原创 细聊 Cocoapods 与 Xcode 工程配置

前言文章比较长,所以在文章的开头我打算简单介绍一下这篇文章将要讲述的内容,读者可以选择通篇细度,也可以直接找到自己感兴趣的部分。既然是谈 Cocoapods,那首先要搞明白它出现的背景。有经验的开发者都知道 Cocoapods 在实际使用中,经常遇到各种问题,存在一定的使用成本,因此衡量 Cocoapods 的成本和收益就显得很关键。Cocoapods 的本质是一套自动化工具。那么了解自动化流程背后

2017-01-09 13:49:03 3230 2

原创 我的 2016 年总结

时光飞逝,一转眼已经是一年过去了, 去年的今天我写下了第一篇年度总结:一个普通iOS开发者的2015大总结。在写作那篇文章之前,我觉得一年前的自己完全是一个傻逼;今天重读一遍以后,我感觉一年前的自己也非常傻逼。在写下这一年总结的同时,我也希望明年的自己在回顾这篇文章的时候,可以发出不屑的鄙视。实际上我认为: 刚开始学习的前五年是发展最快的五年,每一年都应该感觉到自己在过去的一年中发生了天翻地覆的

2017-01-04 18:15:27 3308 9

原创 深入理解 iOS 开发中的锁

摘要本文的目的不是介绍 iOS 中各种锁如何使用,一方面笔者没有大量的实战经验,另一方面这样的文章相当多,比如 iOS中保证线程安全的几种方式与性能对比、iOS 常见知识点(三):Lock。本文也不会详细介绍锁的具体实现原理,这会涉及到太多相关知识,笔者不敢误人子弟。本文要做的就是简单的分析 iOS 开发中常见的几种锁如何实现,以及优缺点是什么,为什么会有性能上的差距,最终会简单的介绍锁的底层实现原

2016-10-07 08:22:53 3561 2

原创 白话 Ruby 与 DSL 以及在 iOS 开发中的运用

阅读本文不需要预先掌握 Ruby 与 DSL 相关的知识何为 DSLDSL(Domain Specific Language) 翻译成中文就是:“领域特定语言”。首先,从定义就可以看出,DSL 也是一种编程语言,只不过它主要是用来处理某个特定领域的问题。广为人知的编程语言有 C、Java、PHP 等,他们被称为 GPL(General Purpose Language),即通用目的语言。与这些语言

2016-09-29 13:08:39 1993

原创 获取任意线程调用栈的那些事

BSBacktraceLogger 是一个轻量级的框架,可以获取任意线程的调用栈,开源在我的 GitHub,建议下载下来结合本文阅读。我们知道 NSThread 有一个类方法 callstackSymbols 可以获取调用栈,但是它输出的是当前线程的调用栈。在利用 Runloop 检测卡顿时,子线程检测到了主线程发生卡顿,需要通过主线程的调用栈来分析具体是哪个方法导致了阻塞,这时系统提供的方法就无

2016-08-29 09:51:20 14074 5

原创 移动端开发者眼中的前端开发流程变迁与前后端分离

写在最开始移动端与前端的区别前端开发的混沌时代后端 MVCMVC 方案实现MVC 的缺点与改进前端只写 DemoHTML 模板后端 MVC 架构总结AJAX 与前端 MVC前后端分离的缺点双端 MVC 不统一SEO性能不够集中 Or 分离Nodejs前后端分离的哲学Nodejs 分层实战应用风险控制总结参考资料写在最开始这是一篇面向移动端开发者的科普性文章

2016-08-20 08:57:31 24585 8

原创 为什么要用 Node.js

这是一个移动端工程师涉足前端和后端开发的学习笔记,如有错误或理解不到位的地方,万望指正。Node.js 是什么传统意义上的 JavaScript 运行在浏览器上,这是因为浏览器内核实际上分为两个部分:渲染引擎和 JavaScript 引擎。前者负责渲染 HTML + CSS,后者则负责运行 JavaScript。Chrome 使用的 JavaScript 引擎是 V8,它的速度非常快。Node.

2016-08-18 14:20:11 3716 2

原创 深入探究Swift数组背后的协议、方法、拓展

Swift中的集合最近翻译完了《Advanced Swift》中文版的“集合”章节。书的质量非常高,讲解非常细致。但不可避免的导致篇幅有点长,有些前面的知识点看到后面无法串联起来。同时由于偏重于讲解,所以个人感觉总结还不够,比如我们可以考虑这几个问题:数组类型(_ArrayType)、集合(Collection)、序列(Sequence)、生成器(Generator)、元素(Element)、下标

2015-12-15 20:20:37 2566 1

原创 KT学算法(四)——找数组中出现超过一半的数字的优雅解和拓展

问题描述数组中有一个数字出现次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度一半,因此输出2问题分析首先想到的是,可以维护一个数据结构用来存储每个数字对应的出现次数。没遇到一个新的数字就去找这个数字是否出现过,如果出现过就加1.这种思路最简单,但是时间复杂度是O(n^2)。稍做优化,可以把数组排序,然

2015-11-28 22:05:38 2558

原创 UIView生命周期详解

序言本文将简要讨论一下几个问题:loadView、viewDidLoad、viewDidAppear、initWithNibName、awakeFromNib等经常出现在UIViewController中的方法介绍。这些方法分别用来作哪些工作,换言之,创建自定义的View时代码放到以上哪个方法中。一个UIView的生命周期是怎样的。以上几个方法的调用顺序如何。通过IB和代码加载视图,有什么区

2015-11-27 13:40:10 5125 1

原创 UIView的contentMode属性总结

UIView的contentMode属性最初知道这个属性还是以前面试的时候,面试官看到我app的一个图片有些变形,于是考了我这个问题。确实之前没有仔细思考过,一堆枚举值看上去也挺头疼,这次把它总结一下。我们知道,定义的UIView的frame大小,和它实际需要显示的内容的大小并不总是一直的。这个问题在使用UIImageView的时候格外容易发生。很有可能图片的真实大小、长宽比例和定义的frame不

2015-11-24 00:15:04 14836

原创 一个数字的魔法——破解Mac上198元的Paw

背景和目的在某位大神的博客里看到了Mac一款非常好用的App,叫Paw。Paw可以在Mac上模拟各种HTTP请求,可视化的管理HTTP Header、Parameters、Cookies等,还有一点非常出乎意料的功能是通过下载插件可以自动生成Swfit、OC、JS等多种语言的代码。然而Paw巨贵(198软妹币),而且破解版不好搜。于是寻思着自己动手解决需求,于是倒霉的Paw成了实验对象。先从这里下载

2015-11-22 21:53:51 8558 3

原创 genstrings命令与字符串本地化

之前实习的时候大概接触过字符串本地化。但是不太知道具体原理,只知道如何去使用。看完genstrings之后好像明白是怎么回事了。字符串本地化的使用如果有一个按钮,上面的文字在中文系统上显示为“点击”,在英文系统上显示为“Click”,我们可以这么做:button.text = NSLocalizedString(@"click", nil);这里的click其实相当于字典的key,然后我们维护两套字

2015-11-19 21:21:11 5341

原创 轻量化ViewController的几个小技巧

轻量化ViewControllerMVC最令人头疼的问题可能就是随着项目愈发复杂,ViewController的代码也会变得越来越冗长。阅读了objc的《Lighter View Controllers》和《Clean Table View Code》这两篇文章之后,总结了一些常用的轻量化ViewController的小技巧。分离业务重点既然要简化ViewController中的代码,那么在不改变原

2015-10-11 22:47:10 3068

原创 KT学算法(三)——最长回文子串与Manacher算法

题目来源: https://leetcode.com/problems/longest-palindromic-substring/解题思路:方法一:暴力查找:由于找到字符串的所有字串的时间复杂度为O(n^2),判断一个字符串是否为回文串需要遍历,时间复杂度为O(n),所以这个算法的时间复杂度为O(n^3)方法二:对于任意一个长度为n的字符串,总是存在最长的回文字串,对于这个回文字串而言,它的

2015-10-03 11:45:46 1367

原创 Swift入门(十二)——利用Extension添加逆序输出字符串方法

Swift好像没有自带逆序输出字符串的方法,于是决定通过拓展(Extension)给String类添加一个逆序输出字符串的reverse方法。首先新建一个Swift文件,命名规则不太清楚,于是暂且模仿OC叫做String+Operation吧,然后实现我们需要拓展的方法。下面先贴上代码,然后解释一下这段代码。//String+Operation.swifftimport Foundation//逆

2015-08-30 23:58:53 3292 1

原创 Swift入门(十一)——类型转换与is、as操作

三种操作:is、as?和as!Swift是强类型语言,但也允许开发者通过is、as?和as!这三种操作来对类型进行判断和强制转换。其中is用作类型判断,而as?和as!则分别是类型转换的可选形式和强制形式。在这里强调一下,swift中比较常用的向下转换(downcast)是没有as操作符的。为了方便后面的解释,这里假设定义了三个类,Fruit、Apple和Orange,其中Apple和Orange都

2015-08-29 00:45:02 3621 1

原创 彻底搞懂OC中GCD导致死锁的原因和解决方案

GCD提供了功能强大的任务和队列控制功能,相比于NSOperationQueue更加底层,因此如果不注意也会导致死锁。所谓死锁,通常指有两个线程A和B都卡住了,并等待对方完成某些操作。A不能完成是因为它在等待B完成。但B也不能完成,因为它在等待A完成。于是大家都完不成,就导致了死锁(DeadLock)。有一定GCD使用经验的新手通常认为,死锁是很高端的操作系统层面的问题,离我很远,一般不会遇上。其实

2015-08-27 23:56:26 19545 6

原创 Swift入门(十)——循环引用、弱引用和无主引用

最近看到swift里面不仅有循环引用和弱引用(weak),还添加了无主引用(unowned),于是写了一些demo,这里总结一下。和OC一样,Swfit默认也是基于ARC进行内存管理的,因此虽然简单,但如果不注意任然会出现循环引用问题(Retain cycle),导致内存泄露。在OC中,可以很简单的举出一个循环引用的例子。比如有两个类A和B,A中有一个属性是B类的实例,而B中又有一个属性是A类的实例

2015-08-23 00:12:34 7021

原创 Xcode6下iOS单元测试——XCTest和GHUnit框架简介和比较

iOS单元测试(UnitTest)在iOS中进行测试可以选择XCTest和GHUnit测试两种框架。XCTest集成在Xcode中,而GHUnit则是一个著名的开源框架。所谓的单元测试,就是指把程序分割成若干个小单元,对每个小单元单独进行测试。所谓的小单元,可以是一个方法,一个UI控件,一次简单的事件等等。本文不重点讨论测试的意义,所以就选择最简单的加法函数,介绍iOS如何进行单元测试。XCTest

2015-08-21 01:15:25 3247

原创 Swift入门(九)——String与Int、Double、Float等数字相互转换

三种转换模式任何语言里面,Int、float、double等数字类型自成一派,但它们和String类型之间的转换总是不太方便,这里总结一下它们相互转换的方法。总结下来一共有三种转换模式,分别举例说明。一、String转数字这里以String类型转Int类型为例。String转其他的数字类型(Float、Double等)大同小异。主要用到的方法是String类型的toInt方法。注意这个方法返回的是I

2015-08-14 00:20:43 66366 3

原创 实习小结——UIBarButtonItem和UINavigationBar的坑

这一周做了很多UI方面的东西,遇到的坑主要集中在UIBarButtonItem和UINavigationBar,记录一下备查。UIBarButtonItem自定义位置直接用系统默认的方式生成按钮是无法选择位置的,甚至连这个按钮的默认位置都不清楚。如果想要自定义按钮的位置,有两种选择。一、直接修改系统生成的按钮。可以通过UIBarButtonItem的imageInsets属性,修改图片的位置,从而间

2015-08-09 11:17:18 3282 1

原创 Swift在for循环中报错'++' is not a binary operator

最近刚开始学swift,遇到了一个非常诡异的问题。是在写for循环的时候出现语法错误。代码如下:for var i = 0; i < 10; i++{ println("hello world") }按理说这是Swift里最简单的for循环的使用了。但是编译器还是报了两个错:‘++ is not a binary operator’Operator is not a known bina

2015-08-08 23:27:19 3951

原创 Swift入门(八)——功能强大的求余运算符

求余运算符在大部分语言中,%都是求余运算符。其功能非常简单,不过也只支持int类型正数之间的求余。 比如 10 % 3 = 1。严格来说,正整数之间的求余的定义如下: 对于任意a,b∈N*,定义m = a % b,其中m满足: a = b * m + r且0 <= r < bSwift中的求余使用场景拓展Swift中的求余,不再是两个int类型正数之间的运算符了。不仅负数可以求余,浮点数

2015-08-06 00:12:12 7113

原创 Swift入门(七)——结构体(Struct)

引子之前我们在用Int,String等类型的时候,可能没有仔细研究过,其实这些基本类型与C或者Java不一样,不是严格的“基本类型”,他们其实是经过封装的结构体。按住Alt键点击Int类型后,可以看到Int结构体的完整定义/// A 64-bit signed integer value/// type.struct Int : SignedIntegerType { var value

2015-08-03 23:58:14 6032

原创 Swift入门(六)——字典(Dictionary)

字典的定义和上一篇文章讲到的数组类似,字典也是用来存放相同数据类型的元素的数据结构。不过字典是通过键(Key)来查找特定的值(Value),字典中存放的每一个数据项(item)都是这样的一个键值对。哈希化每一个键值对的值,没有特殊要求,但是只有可以哈希化的类型的变量,才可以作为键值对的键。可以哈希化是指,该类型的变量,必须提供一个可以计算出自身哈希值的方法。哈希值不相同的变量,自身一定也不相同,反之

2015-08-02 16:18:46 5280

原创 Swift入门(五)——数组(Array)

集合集合的定义Swift中提供了两种数据结构用于存放数据的集合,分别是数组(Array)和字典(Dictionary)。他们的主要区别在于数组中的元素由下标确定,而字典中的数据的值由数据的键(Key)决定。以下我们认为集合就是数组或字典。集合的可变性我们可以定义一个集合常量或者集合变量。一旦定义为常量,就意味着集合的长度、内容和顺序都不能再修改了。比如,定义为常量的数组,不能再向其中添加新的元素。数

2015-08-01 21:59:39 5810

原创 Swift入门(四)——可选类型(Optionals)与断言(Assert)

可选类型是什么?首先看一个问题,Swift中String类型的变量有一个叫做toInt的方法,可以把String类型变量转换为Int类型变量。var stringValue = "5"var intValue = stringValue.toInt();println("intvalue = \(intValue)")执行以上方法后得到了奇怪的结果:intvalue = Optional(5)其

2015-07-31 00:18:45 3549 2

原创 Swift入门(三)——元组(Tuple)

定义元组是一个包含了若干个相关联变量的对象。元组的创建var newTuple = ("kt",20)//由于Swift的类型推导,newTuple被推导为(String,Int)类型的变量元组的解绑几个变量一旦联合在一起,组成了一个元组,他们就被“绑定”了,要想从一个元组中单独取出某一个数据时,需要解绑元组。直接解绑直接解绑是最简单的一种解绑方式,只要定义若干个变量与元组中的变量一一对应即可。v

2015-07-30 23:01:51 5027

原创 Swift入门(二)——字符与字符串

Swift入门系列教程Swift字符Swift入门(一)——基本语法Swift入门(三)——元组(Tuple)定义Swift中的字符,与OC有些不同,每一个字符代表了一个可拓展的字母集,可拓展的字母集由若干个(大于等于一个)Unicode标量值表示,这些标量构成了一个可拓展的字母集,也就是一个人类可读的字符。Unicode标量一个Unicode标量占据21个比特位,一般格式为“U+xxxx”,这个解

2015-07-30 00:34:06 3840 1

原创 Swift入门(一)——基本语法

最近开始学习swift,把学习的过程和总结整理成一个系列,方便日后回顾总结。基本语法基础语法swift中每一行结束后不需要加分号,多个语句在同一行内需要用分好隔开 //表示注释,或者用/* ……*/常量常量是指定义之后无法修改值的量,比如设置一个最大尝试登陆的次数,它的值一旦被确定,就不应该在程序中被修改。swift中的常量用let表示,定义方法如下:let maxAttemptTime = 3

2015-07-29 00:17:11 4768 2

原创 你真的理解__block修饰符的原理么?

开篇自测在本文的开头,提出两个简单的问题,如果你不能从根本上弄懂这两个问题,那么希望你阅读完本文后能有所收获。为什么block中不能修改普通变量的值?__block的作用就是让变量的值在block中可以修改么?如果有的读者认为,问题太简单了,而且你的答案是:因为编译器会有警告,各种教程也都说了不能修改。应该是的吧。那么我也建议你,抽出宝贵的几分钟时间阅读完本文吧。在开始揭开__block

2015-07-27 19:26:24 22052 4

原创 dismissViewController实现多个模态视图跳转

最近实现的一个需求需要用到模态视图,所以少不了与dismissViewController方法打交道。本文主要讲一讲在使用dismissViewController方法过程中遇到的那些坑。由于业务逻辑比较特殊,程序中需要在A试图控制器中present B试图控制器的视图,B视图控制器需要present C视图控制器中的视图。最后从C直接返回A。dismissViewControllerAnimate

2015-07-14 22:50:29 11932 3

原创 scrollViewDidEndDecelerating方法不执行解决方案

如果是因为忘记指定代理这种低级错误导致的回调函数不执行,这里不进行任何讨论。通常,我们希望在滑动结束后,执行一些代码。scrollViewDidEndDecelerating方法在一定程度上可以解决我们的需求。注意是一定程度上。顾名思义,scrollViewDidEndDecelerating表示减速结束了。然而减速结束和滑动结束并不等价。因为有些滑动并不需要减速也可以结束。比如我两只手轮流向左滑动

2015-07-06 22:28:34 13605 4

原创 ARC下查看对象的引用计数

网上各种文章、问答给出的结论都是“ARC下无法打印对象的引用计数值”。确实,ARC禁止直接查看Objective-C对象的引用计数,但是Objective-C对象不是还可以转化为Core Foundation对象么?于是动手做了一个小实验:id obj = [[NSObject alloc]init];printf("retain count = %ld\n",CFGetRetainCount((

2015-06-28 13:23:55 14360 3

原创 Core Data 数据验证

本文前半段通过整理苹果官网的技术文档——《Core Data Validation》得出。此外提供了一段进行Core Data数据验证的代码,点击这里下载。文章后半段是对这份代码的简单解释。根据苹果官网的描述,Core Data的数据验证分为两种类型。分别被称为属性级(property-level)和内部级(inter-property)。属性级验证用于验证单个数据是否合法,内部级验证用于验证若干个

2015-06-22 21:16:31 1276

原创 Core Data 通过GCD实现多线程管理

对于某个比较耗时的数据库操作,我们可以采取多线程的方式,避免阻塞UI线程。本文的完整代码,可以点击这里下载Core Data的多线程操作,主要涉及两个问题。 1.如何使用多线程? 2.子线程中的更新如何通知主线程?网上类似的教程非常多,这里就不细说了。主要思路就是,NSManagedObjectContext并不是线程安全的,而NSPersistentStoreCoordinator则是

2015-06-22 14:59:02 1660

Reveal 1.6.2破解版

iOSUI调试利器,最新版,完美破解,新版对autolayout支持的更好,支持显示ViewController,适配iOS9,支持多屏显示,运行创建屏幕快照并分享

2015-11-19

CoreData数据验证

通过一段具体的代码演示了CoreData如何验证输入数据是否满足要求

2015-06-22

Core Data数据验证

这一段代码具体实现了如何验证输入数据的合法性。

2015-06-22

Core Data多线程操作

通过一个工程,具体演示了如何在多线程环境下,实现简单的Core Data操作

2015-06-22

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除