├── BlockKit ├── JSBridgeiOS7 ├── Mantle ├── POP ├── RACCommand ├── RACSignal ├── RAC响应Delegate ├── README.md ├── ReactiveCocoa(RAC) ├── SDWebImage ├── Yosemite重安装Cocoapods ├── atos打印错误位置 ├── cocoapods安装 ├── iOS9适配系列教程(中英文) ├── release下关闭assert ├── swift ├── xib的动态桥接 ├── 关于网络优化 ├── 动画 ├── 手写UI还是用IB? └── 禅与 Objective-C 编程艺术 /BlockKit: -------------------------------------------------------------------------------- 1 | 2 | https://github.com/zwaldowski/BlocksKit 3 | 4 | 详细文档说明: 5 | http://pandamonia.github.io/BlocksKit/Documentation/ 6 | 7 | 入门系列: 8 | http://z.payliu.me/2013/04/begin-of-blockskit.html 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /JSBridgeiOS7: -------------------------------------------------------------------------------- 1 | 2 | 3 | http://blog.sina.com.cn/s/blog_a7d837ea0102w7j7.html 4 | https://github.com/CoderJackyHuang/IOSCallJsOrJsCallIOS 5 | 6 | -------------------------------------------------------------------------------- /Mantle: -------------------------------------------------------------------------------- 1 | 2 | 3 | github地址: 4 | https://github.com/Mantle/Mantle 5 | 6 | 7 | 介绍文章: 8 | http://ourui.github.io/blog/2014/01/22/mantle-use/ 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /POP: -------------------------------------------------------------------------------- 1 | 2 | facebook/pop: 3 | https://github.com/facebook/pop 4 | 5 | 6 | 使用指南: 7 | https://github.com/maxmyers/FacebookPop 8 | http://www.cocoachina.com/applenews/devnews/2014/0527/8565.html 9 | http://www.cocoachina.com/applenews/devnews/2014/0507/8339.html 10 | 11 | pop使用例子: 12 | https://github.com/kejinlu/facebook-pop-sample 13 | 14 | POP之上封装一些属性,可直接在storyboard中设置: 15 | https://github.com/WilliamZang/FastAnimationWithPOP 16 | https://github.com/WilliamZang/FastAnimationWithPopDemo DEMO 17 | 通过user defined runtime attributes可直接在IB中设置。 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /RACCommand: -------------------------------------------------------------------------------- 1 | 2 | 介绍: 3 | http://codeblog.shape.dk/blog/2013/12/05/reactivecocoa-essentials-understanding-and-using-raccommand/ 4 | 5 | 示例工程笔记: 6 | 1、界面按钮触发viewModel的command。 7 | self.subscribeButton.rac_command = self.viewModel.subscribeCommand; 8 | 9 | 2、viewModel初始化时用statusMessage响应comand的结果: 10 | -- 正在发email显示@"Sending request..." 11 | -- 发email完成显示@"Thanks" 12 | -- 失败显示@"Error :(" 13 | - (void)mapSubscribeCommandStateToStatusMessage; 14 | 15 | 3、viewModel里command被触发时先判断email地址是否有效,有效则执行发送动作。 16 | return [SubscribeViewModel postEmail:self.email]; 17 | 18 | 4、发邮件函数内直接返回AFNetworking的RAC扩展方法rac_POST返回的信号。 19 | return [[[manager rac_POST:kSubscribeURL parameters:body] logError] replayLazily]; 20 | 21 | 22 | 动作触发过程: 23 | 1、界面按钮被点击,触发viewModel的command。 24 | 2、command实际是判断地址是否有效,然后返回rac_POST的信号直接执行。 25 | 3、由于viewModel初始化时将statusMessage与command的状态绑定,而界面Label观察了statusMessage,所以command执行状态被显示到界面。 26 | 27 | ---------------------------------------------------------------------------- 28 | - 一个更简单的例子 29 | // 每当login按钮点击的时候,这一block就会被执行 30 | self.loginCommand = [[RACCommand alloc] initWithSignalBlock:^(id sender) { 31 | // 这个登录方法返回一个信号,这个信号在网络请求结束的时候会发送一个值 32 | return [client logIn]; 33 | }]; 34 | 35 | // -executionSignals方法每当loginCommand执行完成后返回一个包含上边block中返回的信号的信号 36 | [self.loginCommand.executionSignals subscribeNext:^(RACSignal *loginSignal) { 37 | // 登录成功后输出 38 | [loginSignal subscribeCompleted:^ { 39 | NSLog(@"Logged in successfully!"); 40 | }]; 41 | }]; 42 | 43 | // 当按钮点击的时候执行loginCommand. 44 | self.loginButton.rac_command = self.loginCommand; 45 | 46 | ///// 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /RACSignal: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------- 3 | - text不仅可直接依据RACObserve观察的值变化,而且可将RACObserve的值进行判断后重新输出。 4 | UITextField的rac_textSignal一样可用。 5 | combineLatest中可以放多个信号,响应多个信号变化(但是需要多个信号都至少有一个值时reduce才会执行)。 6 | RAC(self.statusLabel, text) = [RACSignal 7 | combineLatest:@[ RACObserve(self.viewModel, statusMessage) ] 8 | reduce:^(NSString *text) { 9 | return ([text hasPrefix:@"T"] ? [NSString stringWithFormat:@"1-%@", text] : text); 10 | }]; 11 | 12 | -------------------------------------------------------------------------- 13 | - 对观察的值做过滤 14 | [[RACObserve(self, username) 15 | filter:^(NSString *newName) { 16 | return [newName hasPrefix:@"j"]; 17 | }] 18 | subscribeNext:^(NSString *newName) { 19 | NSLog(@"%@", newName); 20 | }]; 21 | 22 | -------------------------------------------------------------------------- 23 | // fetchUserRepos与fetchOrgRepos是两个异步操作,merge会在两个操作都完成的情况下返回一个新的信号。 24 | [[RACSignal 25 | merge:@[ [client fetchUserRepos], [client fetchOrgRepos] ]] 26 | subscribeCompleted:^{ 27 | NSLog(@"They're both done!"); 28 | }]; 29 | 30 | 31 | 32 | -------------------------------------------------------------------------- 33 | - switchToLatest方法用于含有多个信号的信号(signal-of-signals),它总是输出(forwards)最新的信号的值。 34 | RACSubject *letters = [RACSubject subject]; 35 | RACSubject *numbers = [RACSubject subject]; 36 | RACSubject *signalOfSignals = [RACSubject subject]; 37 | 38 | RACSignal *switched = [signalOfSignals switchToLatest]; 39 | 40 | // Outputs: A B 1 D 41 | [switched subscribeNext:^(NSString *x) { 42 | NSLog(@"%@", x); 43 | }]; 44 | 45 | [signalOfSignals sendNext:letters]; 46 | [letters sendNext:@"A"]; 47 | [letters sendNext:@"B"]; 48 | 49 | [signalOfSignals sendNext:numbers]; 50 | [letters sendNext:@"C"]; 51 | [numbers sendNext:@"1"]; 52 | 53 | [signalOfSignals sendNext:letters]; 54 | [numbers sendNext:@"2"]; 55 | [letters sendNext:@"D"]; 56 | 57 | -------------------------------------------------------------------------- 58 | - 使用distinctUntilChanged后相同的值会被忽略 59 | [RACObserve(self.user, username) distinctUntilChanged]; 60 | 61 | 62 | -------------------------------------------------------------------------------- /RAC响应Delegate: -------------------------------------------------------------------------------- 1 | 2 | /////////////////////////////////////////////////////////////////////// 3 | - (RACSignal *)rac_signalForSelector:(SEL)selector fromProtocol:(Protocol *)protocol; 4 | 响应协议的方法,可用来替代响应delegate。 5 | 6 | RACSignal *errorSignal = 7 | [self rac_signalForSelector:@selector(flickrAPIRequest:didFailWithError:) 8 | fromProtocol:@protocol(OFFlickrAPIRequestDelegate)]; 9 | 10 | [errorSignal subscribeNext:^(RACTuple *tuple) { 11 | [subscriber sendError:tuple.second]; 12 | }]; 13 | 14 | /////////////////////////////////////////////////////////////////////// 15 | - (RACSignal *)rac_signalForSelector:(SEL)selector; 16 | 类似hook一个方法,在方法被调用后执行自己的一段代码。 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Mark 2 | ==== 3 | 4 | 记录一些大家推荐的github上的代码,以便学习。 5 | 6 | 7 | http://www.zhihu.com/question/22914651 8 | 9 | http://github.ibireme.com/github/list/ios/ 10 | 11 | http://wangzz.github.io/blog/2014/04/25/githubyou-xiu-xiang-mu-ios/ 12 | 13 | ====================================================== 14 | 15 | 16 | - ReactiveCocoa:ReactiveCocoa/ReactiveCocoa · GitHub: 17 | 18 | GitHub自家的函数式响应式编程泛型的Objective-C实现,名字听着很高大上,学习曲线确实也比较陡,但是绝对会改变你对iOS编程的认知,首推之。 19 | 20 | - Mantle:Mantle/Mantle · GitHub 21 | 22 | 又是GitHub自家的产物,轻量级建模的首选,也可以很好的配合CoreData工作。 23 | 24 | - AFNetworking:AFNetworking/AFNetworking · GitHub: 25 | 26 | iOS7之前,苹果自带的网络库有多难用!matt大神的AFNetworking绝对可以解放你。使用苹果的NSURLRequest及iOS7的NSURLSession,清晰的架构,足够的文档,可以认为是第三方开源库的楷模了。 27 | 28 | - BlocksKit: zwaldowski/BlocksKit GitHub 29 | 30 | 本人相当偏爱Functional Programming,Objective-C中的block绝对满足我的口味。但想用好block也不是很容易,如果对block有爱,就请使用这个库吧。 31 | 32 | - Nimbus:jverkoey/nimbus · GitHub 33 | 34 | 第一次关注nimbus是因为Facebook的Three20开源库。可惜Three20库已死,主要作者跳出来,写了nimbus。 35 | 36 | - pop: facebook/pop · GitHub 37 | 38 | facebook出品的paper,动画效果太好了,赶超apple的原生apple一大截。pop就是paper的动画库! 39 | 40 | 41 | - XMPPFramework:robbiehanson/XMPPFramework · 42 | 43 | GitHub,这个如果是做过聊天的通信通信可能会用过,本人因为工作原因,两年前第一次接触这个代码,就对这个大牛非常崇拜。代码值得学习的东西非常多。作者在开发这个框架的时候,同时也开发了非常多的基础库,都非常值得学习。 44 | 45 | 1. 首先是插件是框架设计,设计的非常优雅,功能强大易扩展,而且写的很简洁,易懂。 46 | 47 | 2. 作者基于GCD设计的一对多的delegate机制--GCDMulticastDelegate,后来在项目中我尝试使用过这个框架,多个模块依赖于某一个核心组件,使用这个类,可以把耦合问题降到很低,值得推荐。 48 | 49 | 3. CocoaAsyncSocket,robbiehanson/CocoaAsyncSocket GitHub,这个是让本人又无比崇拜的一个类库,作者根据iOS平台的特性,实现了两套异步socket网络库,一个基于GCD与POSIX Socket开发的socket异步网络库,另外一个是使用CFSocket与runloop实现,我曾经尝试去阅读这个类库,不过后来发现自己能力实现有限,只能看个大概的轮廓。 50 | 51 | 4. CocoaLumberjack,CocoaLumberjack/CocoaLumberjack GitHub,这个是作者写的一个log系统,实现了分级别的日志系统,不过本人没有使用和学习这个,我们项目没有那么复杂,我是自己使用宏和NSLog写了一个分级别显示的日志系统,只能用于打印,不能像这个日志可以写入文件。 52 | 53 | 5. KissXML robbiehanson/KissXML GitHub 54 | 55 | 我们平时一般使用json格式的数据,除了组装xmpp聊天消息,对这个没有怎么使用过,不敢评论。 56 | 57 | 58 | 59 | - AFNetworking:AFNetworking/AFNetworking · 60 | 61 | GitHub,毫无疑问,最火的网络库,本人11年开始做iOS开发的时候,是使用ASI的,一直没有使用过AFNetworking,直到12年的时候,发现ASI作者基本不更新ASI之后,才开始关注这个项目。ASI是基于CFSocket实现的HTTP网络库,作者功底之强,跟上面的老大一样让人拜服,而AFNetworking是基于NSURLConnection,以及iOS7之后出现的NSURLSession为基础开发的。由于AFNetworking基于Apple的封装,少了很多需要自己维护的地方,而且整个项目也会非常整洁,可能效率上也会高于ASI的封装。建议可以把整个项目过一遍,框架设计思想不用说了,里面也可以学习到非常多的技术点。 62 | 63 | 1. NSOperation的封装与使用,面试的时候很多人只知道apple有NSOperation这个技术,但是实际上使用的机会并不多,只知道是个队列,但是对于如何使用并不知晓。可惜的是,这个只提供了如何使用进非并发Operation的封装。完整学习的话,可以学习ASI中对operation的使用,会更完整一些。 64 | 65 | 2. HTTP请求的封装,如何封装POST请求,如何进行URL encode,如何使用NSInputstream,可以对HTTP理解有个突破。同时可以学习一下NSURLSession与NSURLConnection的使用。 66 | 67 | 3. Runloop的使用, 68 | 69 | 建议与ASI实现同步请求的方法进行对比,有条件的话可以跟android的looper机制进行对比,说不定什么时候会使用到,实际xmppframework中也有用到,只是不是核心机制,而且本人没有研究过。本人从11年做iOS到现在,只是使用到过一次,是需要自己实现一个OpenGL的渲染队列,由于需要在子线程中做渲染,无法使用CADisplaylink。刚开始其实是使用GCD的,但发现即使我创建一个dispatch_queue_t,也无法保证block是在子线程中被执行,而且还有较为复杂的内存管理问题,最后使用NSThread与runloop才解决问题。 70 | 71 | 72 | - SDWebImage:rs/SDWebImage · GitHub, 73 | 74 | 不需要多说,这个框架写的非常简洁,也是读这个框架,让我明白什么是缓存机制,以及如何做面向对象的封装设计,我之后有的场景也需要自己去设计一些cache,每次都是借鉴这个框架实现,能力有限,自己实在想不出比这个设计思路好的地方,只能借鉴别人的做法。我觉得这个项目还有一个非常值得推崇的地方,就是对category的使用,这个是我今年之前一直忽略的非常重要的设计模式,太适合团队开发了,上讲的东西,做到现在我才明白怎么回事,可以对比Android使用网络图片,你会发现OC的category真方便。 75 | 76 | 77 | - EGOTableViewPullRefresh: enormego/EGOTableViewPullRefresh GitHub, 78 | 79 | 本来不打算说UI方面类库的,但是这个必须说一下。建议读一下这个的源码,以及如何使用,对iOS UI开发有很大提升,这个类库写的很简洁,可以帮助理解delegate机制以及Protocol的概念,还能加深对UIScrollView的理解,推荐读一下。 80 | 81 | - TheElements:TheElements, 82 | 83 | 这个是apple的官方示例代码,每次我朋友问题如何学习iOS的时候,我总会推荐这个samplecode,这个代码让我对iOS开发的理解有个很大的突破。里面并没有使用大量的storyboard和xib隐藏细节,并不是说只能用纯代码做事情,而是可以让人看到里面很多的实现细节,加深理解。读这个代码,我才明白什么是apple说的MVC,还有一个xcode工程到底是如何从main函数运行起来的,非常强烈推荐阅读学习。 84 | 85 | 86 | - Masonry 87 | 88 | 大大简化AutoLayout的写法。比如 89 | 90 | [view1 mas_makeConstraints:^(MASConstraintMaker *make) { 91 | make.edges.equalTo(superview).with.insets(padding); 92 | }]; 93 | 94 | - CocoaLumberjack 95 | 96 | 日志库。 97 | 98 | 99 | - WebViewJavascriptBridge 100 | 101 | Obj-C与JavaScript通讯。 102 | 103 | 104 | 105 | 106 | 107 | -------------------------------------------------------------------------------- /ReactiveCocoa(RAC): -------------------------------------------------------------------------------- 1 | 2 | 看到RAC的感觉就像以前C++时看到boost的感觉,可能这是一个量变后进行质变提高的机会。 3 | 4 | github地址: 5 | https://github.com/ReactiveCocoa/ReactiveCocoa 6 | 7 | 为什么要用RAC: 8 | http://www.cnblogs.com/yangecnu/archive/2012/11/03/Introducting_ReactiveExtensions.html 9 | 10 | 介绍: 11 | http://www.cocoachina.com/applenews/devnews/2014/0630/8985.html 12 | http://blog.devtang.com/blog/2014/02/11/reactivecocoa-introduction/ 13 | https://speakerdeck.com/robb/reactivecocoa-nsspain 14 | https://github.com/blog/1107-reactivecocoa-for-a-better-world 15 | 16 | http://blog.segmentfault.com/erliu/1190000000407346 各个对象的概述 17 | 18 | http://www.teehanlax.com/blog/getting-started-with-reactivecocoa/ 19 | http://www.teehanlax.com/blog/reactivecocoa/ 20 | 21 | http://iiiyu.com/2013/09/11/learning-ios-notes-twenty-eight/ 22 | http://iiiyu.com/2013/10/15/learning-ios-notes-twenty-nine/ 23 | 24 | http://www.itiger.me/?p=38 25 | 26 | RAC、RACSignal、RACStream中文介绍系列: 27 | http://www.cnblogs.com/sunnyxx/p/3543542.html 28 | http://www.itiger.me/?p=38 29 | 30 | 一个教程: 31 | http://www.raywenderlich.com/62699/reactivecocoa-tutorial-pt1 32 | http://www.raywenderlich.com/62796/reactivecocoa-tutorial-pt2 33 | 34 | “无网不剩”的blog介绍: 35 | http://blog.leezhong.com/tech/2014/06/06/deep-into-reactivecocoa2.html 介绍一些实际编码 36 | http://blog.leezhong.com/ios/2013/12/27/reactivecocoa-2.html 37 | http://blog.leezhong.com/ios/2013/06/19/frp-reactivecocoa.html 38 | http://blog.leezhong.com/image/FRP_ReactiveCocoa_large.png 39 | http://blog.leezhong.com/ios/2014/01/05/ios-rest-client-implementation.html 40 | 41 | 资料翻译(比较生硬) 42 | http://blog.sina.com.cn/s/blog_6591f6a20101cmz5.html 43 | 44 | Reactive Extension的介绍: 45 | http://www.cnblogs.com/yangecnu/archive/2012/11/03/Introducting_ReactiveExtensions.html 46 | 47 | 一个使用RAC的例子(天气预报): 48 | http://sjpsega.com/blog/2014/02/11/yi--ios-7-best-practices-part-1/ 49 | http://sjpsega.com/blog/2014/02/15/yi--ios-7-best-practices-part-2/ 50 | 51 | 一个MVVM例子: 52 | http://cocoasamurai.blogspot.hk/2013/03/basic-mvvm-with-reactivecocoa.html 53 | 54 | 55 | - 关于MVC与MVVM的理解 56 | MVC:V接受交互请求,C根据请求向M获取数据,C将M送给V,V显示或回复请求。对M的处理在V中进行。 57 | MVVM:C接受V的交互请求,VC传递给VM,VM根据请求向M获取数据,VM处理M并通知VC改变界面呈现。对M的处理在VM中进行。 58 | MVVM Example: https://github.com/Machx/MVVM-IOS-Example 59 | 60 | 使用RAC的工程例子 61 | https://github.com/AshFurrow/FunctionalReactivePixels 62 | 63 | 64 | 65 | - 66 | 67 | -------------------------------------------------------------------------------- /SDWebImage: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | https://github.com/rs/SDWebImage 5 | 6 | 一个具体使用的例子: 7 | http://www.wrichards.com/blog/2011/11/sdwebimage-fixed-width-cell-images/ 8 | 9 | SDWebImage之上添加进度: 10 | https://github.com/JJSaccolo/UIActivityIndicator-for-SDWebImage 11 | 12 | 13 | - UIImageView (WebCache)会先取消原来的下载,再启动新加载。而且SDWebImageManager的SDWebImageDownloader *imageDownloader对象设置了最大下载数maxConcurrentDownloads为2,若不修改最大下载数,则也下载到一半的图片被取消后下次需从头开始下载。 14 | 15 | - 使用 options:SDWebImageRefreshCached 跟踪变化的图像,例如用户头像,URL相同但可能改变。会略微降低性能。 16 | - 延时下载 SDWebImageLowPriority 17 | - 渐进式下载显示图片 SDWebImageProgressiveDownload 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /Yosemite重安装Cocoapods: -------------------------------------------------------------------------------- 1 | 2 | 3 | 出处: https://github.com/CocoaPods/CocoaPods/issues/2219#issuecomment-44979127 4 | 5 | 6 | 首先安装Xcode6 的 Command Line Tools,在开发者中心下载 7 | 8 | 接下来按照下面步骤操作: 9 | 10 | 打开 Xcode 6 11 | 打开 Preferences 12 | 选择 Locations 选项卡 13 | 将 Command Line Tools 选择为 Xcode 6.0 14 | 卸载 cocoapods 15 | $ sudo gem uninstall cocoapods 16 | 安装 xcodeproj 17 | $ sudo gem install xcodeproj 18 | 再安装 cocoapods 19 | $ sudo gem install cocoapods 20 | 最后运行 pod --version 就看到Pod正常了。 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /atos打印错误位置: -------------------------------------------------------------------------------- 1 | 2 | 3 | 原来32位编译时一直使用如下方式打印友盟错误报告上的crash地址: 4 | atos -arch armv7 -o 'XXX.app/XXX' 0x00000 5 | 6 | 7 | 使用64位编译后,64位地址使用此方式无法打印代码位置,需修改为如下: 8 | 9 | atos -o XXX.app.dSYM/Contents/Resources/DWARF/XXX -l address0 targetAddress 10 | 11 | 其中: 12 | XXX是AppName; 13 | address0是当前进程在内存中加载的起始地址,对应友盟错误报告里的Slide Address; 14 | targetAddress就是想要符号化的地址 15 | 16 | 17 | ps:需在dSYM文件所在目录中执行命令。 18 | 如果是dSYM同时带armv7和arm64,那么xcrun atos时最好带上加载地址-l和-arch. 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /cocoapods安装: -------------------------------------------------------------------------------- 1 | 2 | 使用淘宝镜像 3 | 4 | $ gem sources --remove https://rubygems.org/ 5 | //等有反应之后再敲入以下命令 6 | $ gem sources -a https://ruby.taobao.org/ 7 | 8 | 9 | 然后安装 10 | 11 | $ sudo gem install cocoapods 12 | 13 | 14 | OSX 10.11 Xcode7 安装报 Operation not permitted - /usr/bin/xcodeproj 问题的解决方法 15 | sudo gem install -n /usr/local/bin cocoapods 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /iOS9适配系列教程(中英文): -------------------------------------------------------------------------------- 1 | 2 | iOS9适配系列教程(中英文) 3 | https://github.com/ChenYilong/iOS9AdaptationTips 4 | 5 | -------------------------------------------------------------------------------- /release下关闭assert: -------------------------------------------------------------------------------- 1 | 2 | release下关闭assert 3 | 在targets种选择build,选择release。在gcc preprocessing下增加Preprocessor Macros 值为 NS_BLOCK_ASSERTIONS. 4 | 5 | -------------------------------------------------------------------------------- /swift: -------------------------------------------------------------------------------- 1 | 2 | 一个大体的介绍。 3 | 特别是array中自动copy的方式。 4 | ? 放在某个 optional 的 protocol 方法的括号前面,以表示询问是否可以对该方法调用。delegate?.questionViewControllerDidGetResult?(self, result) 5 | http://onevcat.com/2014/06/walk-in-swift/ 6 | 7 | 每周一更的tips 8 | http://swifter.tips 9 | 10 | =========================================================== 11 | Tips的总结 12 | 13 | - selector 14 | selector是objc runtime的概念,所以一个 Swift 中的 private 方法如果要使用selector,方法定义前需加上@objc。 15 | 如果方法的第一个参数有外部变量的话,在通过字符串生成 Selector 时还有一个约定,那就是在方法名和第一个外部参数之间加上 with: 16 | func aMethod(external paramName: AnyObject!) { ... } selector中写成 let s = Selector("aMethodWithExternal:")。 17 | 18 | - protocol 19 | protocol内方法不加mutating的话,enum和struct继承时不可在方法内改变成员变量,但class不受影响。 20 | 21 | - @autoclosure 22 | @autoclosure把一句表达式自动地封装成一个闭包。 23 | ?? 类似 ?: 24 | 25 | - Optional Chaining 26 | 返回的也是一个optional。 27 | 28 | - 函数调用时参数名称约定: 29 | 对于普通方法,匿名第一个参数,并强制要求其他的参数名称; 30 | 对于初始化方法,强制要求所有参数使用命名 (除非有特殊情况或完全没有歧义的情况下可以省略名称)。 31 | 对于全局方法,不写参数名称,类似c方法调用。 32 | 33 | - 下标 34 | 自定义数组下标,扩展Array并实现新的subscript。 35 | 36 | - 实例方法的动态调用 37 | let f = MyClass.method 38 | let object = MyClass() 39 | let result = f(object)(1) 40 | 等价于 41 | let object = MyClass() 42 | let result = object.method(1) 43 | getter和setter不可用f方式调用。 44 | 如果类方法和实例方法同名,则上面f方式会取到类方法。 45 | 46 | - 命名空间 47 | 放到不同target里,比如建一个framework。 48 | 统一module下把同名class放到不同struct里,使用时带上struct名。 49 | 50 | - 单例 51 | private let sharedInstance = MyManager() 52 | class MyManager { 53 | class var sharedManager : MyManager { 54 | return sharedInstance 55 | } 56 | } 57 | 利用let保证线程安全,通过private把变量限定在当前文件内。 58 | 59 | - block避免循环引用 60 | block内添加标注 [weak self] ,指明里面的值用何种方式使用。然后再 61 | if let strongSelf = self { 62 | println("The name is \(strongSelf.name)") 63 | } 64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /xib的动态桥接: -------------------------------------------------------------------------------- 1 | 2 | 在Storyboard中将一个view内的子view替换成另一个xib中的view。 3 | 直接在view从xib创建时替换,而非创建后通过代码加入另一个xib的view。 4 | 5 | 主要是利用 - (id) awakeAfterUsingCoder:(NSCoder*)aDecoder 方法,在placeholder view被创建时将其替换为正在需要显示的子view,并将placeholder的autolayout属性设置给正在显示的子view。 6 | 7 | http://blog.yangmeyer.de/blog/2012/07/09/an-update-on-nested-nib-loading 8 | 9 | http://blog.sunnyxx.com/2014/07/01/ios_ib_bridge/#more 10 | https://github.com/sunnyxx/XXNibBridge 示例工程 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /关于网络优化: -------------------------------------------------------------------------------- 1 | 2 | - 直接绑定IP 3 | 4 | 1. app服务端有多ip时,隔一段时间ping多ip,找出最快的一个。 5 | 6 | 2. 利用NSURLProtocol,把域名指向最快的ip。 7 | 8 | 可使用这个 https://github.com/mattt/NSEtcHosts 。 9 | 10 | - 使用HTTPS提高安全性 11 | 12 | - 使用SPDY (不明觉厉) 13 | 14 | https://github.com/twitter/CocoaSPDY 15 | 16 | - 缓存请求和返回内容 17 | 18 | 例如将请求和返回保持一段时间,如果期间有相同请求则直接使用缓存内容。 19 | 20 | - 合并多个请求减少连接次数 21 | 22 | 23 | -------------------------------------------------------------------------------- /动画: -------------------------------------------------------------------------------- 1 | 2 | - 介绍 3 | http://objccn.io/issue-12-1/ 4 | 5 | - 动画库 6 | https://github.com/robb/RBBAnimation 7 | https://github.com/facebook/pop 8 | 9 | - 利用path实现按路径运行的动画 10 | http://oleb.net/blog/2010/12/animating-drawing-of-cgpath-with-cashapelayer/ 11 | 12 | - navigation controller中转场动画的介绍与一个例子 13 | http://objccn.io/issue-5-3/ 14 | https://github.com/zys456465111/CustomPopAnimation 15 | https://github.com/BradLarson/GPUImage // 用GPUImage处理提高效率 16 | 17 | -------------------------------------------------------------------------------- /手写UI还是用IB?: -------------------------------------------------------------------------------- 1 | 2 | 3 | 到底是手写UI还是用IB? 4 | 我赞同使用多Storyboard+部分xib+少量复杂灵活的手写。 5 | 6 | 很赞同这篇博客的说法: 7 | http://onevcat.com/2013/12/code-vs-xib-vs-storyboard/ 8 | 9 | 另外,唐巧的一篇关于使用手写UI的博客,我自己并不赞同。(可能是遇到的环境不同所以观点也不同) 10 | http://blog.devtang.com/blog/2015/03/22/ios-dev-controversy-2/ 11 | 12 | 13 | -------------------------------------------------------------------------------- /禅与 Objective-C 编程艺术: -------------------------------------------------------------------------------- 1 | 2 | 禅与 Objective-C 编程艺术 3 | 4 | https://github.com/oa414/objc-zen-book-cn/ 5 | --------------------------------------------------------------------------------