可使用快捷键,快速便捷归置当前窗口。比如:
ShiftItの使用の様子,https://www.youtube.com/watch?v=yFse0EFDpnM
用了几年了,较为科学,较为稳定,拿走不谢:链接。
以SourceTree为主,结合command line和Github Desktop。不管Git的使用是否有鄙视链,我是挺喜欢用SourceTree的,推荐。当SourceTree搞不定的时候,也会直接用command line(iTerm,zsh)。有时SourceTree从Github上clone也会不顺,比如gist。Github Desktop在这方面就好得多。
]]>7年前,电脑丢了,很多资料、code,都没有push到远端,找不回来了。这个博客是用当时较为流行的Octopress搭建的。静态网站放在Github Pages。静态网站部分都还在,但文章markdown原始版本也遭遇丢失。吃一堑长一智,从那之后我倒是记住了,code不隔夜,都上云。此外电脑也经常用Time Machine备份。
这次得以重新开始更新,经历了4步:
读7年前的东西,真会感觉后背发凉。非常初级和稚嫩。可惜没办法,那就是真实的自己。
这7年,非常忙碌,经历虽多,也在忙碌中忙得碌碌无为。
或许这辈子一直都是个小人物,这我坦然接受。只不过不甘平庸的心一直在,到老了也一样会不停地在追求卓越。
总之,保重身体,人生还长,将来还是会做出成绩的。到时候回顾这一路的摸爬滚打,也许越不容易就会越增加幸福感吧。
]]>Animated GIFs implemented the right way on iOS
iOS上播放gif,没有自带的API,所以我找了现成的库,借过来使用。github上我对比了3个star数目较多的代码,最终选择了OLImageView。
参与对比的是OLImageView,iOS_AnimatedGif,Animated-GIF-iPhone。
对比的指标,我选择
只播放同样一个Gif,OLImageView占用内存是后两者的4/5。
(这个测试可能不完备,没有测试同时播放多个gif,或者播放不同类型gif的对比。但对我使用来讲,只播放这个Gif,就可以说明问题了。)
OLImageView近来都有更新。
后两个中,Animated-GIF-iPhone是从iOS_AnimatedGif分出来的,两个都已经分别3年多、1年多没有更新了,虽然去年iOS_AnimatedGif的作者在blog上说要做对ARC的支持,但也没看更新。
大家可以在github上,看到OLImageView的用法,用法是描述如何从code中创建和使用,非常简单直白。
我在这里介绍一下实际在Storyboard中使用的方式。
下载的OLImageView文件共有6个,但只要把下面四个文件拖进你的工程即可:
正常拖入一个UIImageView,在这个view的CustomClass中设定为OLImageView:
在Outlet中,设定为OLImageView类型
在合适的地方,把gif设定进去,注意这里的UIImage要换成OLImage:
|
|
我的gif是在scrolllView中播放,所以我还需要设定frame:
|
|
我在“药提醒你”的帮助VC中,背景是个gif,具体效果,你可以下载个下来看看^_^——右侧侧边栏“我的产品”。
要是有时间,你尽量阅读一下库的代码。知其然也知其所以然。
我在这里也就写写用法,比较浅显。目的是能让有同样需求的同学,减少一点儿时间开销,哪怕只减少了几分钟,也值得了。
]]>在Storyboard上,TabBarController作为rootViewController,此时想要在某个tab的VC中,点击个button,跳转到另外的tab上。如下图所示:
上图中,在第一个Tab上,点击“点击此处,去新建和管理提醒”,会跳转到第二个Tab,显示全部提醒的列表,来新建和管理提醒。
|
|
分析: 我们在用代码创建app的时候,要在appDelegate中,去指定rootViewController。【不熟悉代码创建app的同学可以阅读这篇学习使用code实现iOS界面,在这篇blog中,推荐的IOS开发之纯代码界面—基本控件使用篇,非常适合新手学习code实现界面】在用Storyboard创建app的时候,虽然不用我们自己去指定rootViewController,但原理是一样的。
Storyboard中,app的入口箭头指向的VC,通常就是rootViewController。在这个例子中,就是UITabBarController。
通过
|
|
得到自己这个appDelegate,通过调用
|
|
就得到了这个UITabBarController(的实例)。再使用UITabBarController(的实例)方法setSelectedIndex,去设定,要跳转到哪个Tab。
|
|
就是跳转到index为1的Tab,也就是第二个Tab了。
]]>有时,同样一个scene(i.e. view controller),除了在Storyboard上通过segue达到以外,还需要在代码的某个地方,让它展现出来。
如何在代码中,调用一个已经在storyboard中设计好的scene呢?代码如下:
|
|
注:代码段来自Call storyboard scene programmatically (without needing segue)?
关键字:代码中调用storyboard中的vc,代码中present storyboard scene
]]>几句话说下我的理解:
|
|
每次启动app时候,调用这段代码。检查一个叫做first_start_加版本号这么个key,对应的NSNumber类型Object,是否存在,或是否是0(NO),如果不存在,或者是0(NO),那么是这个版本的第一次运行,这时做你想在app第一次运行时做的事儿,比如[self versionFirstStart],之后在plist中添加这个key对应的NSNumber类型object,设置成1(YES)。这样,以后app只要未改变版本,启动时就再也不会执行[self versionFirstStart]了。
P.S. 虽然我并未更改这段代码进行更多尝试,但肯定不一定非要NSNumber这个类型,只要plist能存储和读取的类型就可以。
想设定一个属性,你给这个属性起个独有的key,比如叫做@“your property key”。
设置属性:
|
|
读取和判断属性:
|
|
NSUserDefault中存储的object的格式只能是以下列表中的类型,这是plist存储方式决定的。
|
|
了解更多,可查阅Property List Programming Guide
使用NSUserDefault,默认是自动存储的,即你修改完之后,ios自动找个时候,同步(synchronize)一下内存和plist。
手动存储可直接调用synchronize方法:
|
|
查看全部dict内容
|
|
当然,也可以查看全部的key
|
|
windows8系统,装了Outlook2013,占用了C盘大约10G空间,主要都是数据文件(OST文件)占用的。希望能够把数据文件从C盘移至其他盘。并且账户是IMAP账户,不是Exchange。
google一下,绝大多数解决方案是针对以下两种情况:
都不适用。后来发现了这个解决方案,尝试后,成功!分享给大家:
把ost文件移动到其他盘,在原来C盘的ost文件位置建立一个链接,链接到移动后的那个文件,大功告成。引用原作者的描述:
|
|
使用的过程中有需要注意的地方:
windows8的应用程序那儿,搜素cmd,出来“命令提示符”,右键点击,这时屏幕下方会出现几个选项,选择“”以管理员身份运行”
建立符号链接的位置,就是mklink后紧跟的参数的位置,如果不是NTFS格式的盘,恐怕就建立不了了。
虽然windows是个很伟大的系统,并且其中的很多软件也异常优秀,但我已经很久不用windows了。日常使用,我觉得Mac系统是胜过windows的,尤其是对编程写代码的人。
但windows你也得熟悉,一方面由于别人的或公共的电脑windows占比很高,另一方面老婆向你求助的时候,你得帮忙解决问题啊,就像今天这个分享写的这事儿。
]]>本文算是阅读 Beginning ARC in iOS 5 Tutorial Part 1 (翻译在 iOS 5 ARC 入门 (1/3) 翻译的同学很有爱也很辛苦,但有些地方有错误,所以读原文会比较好。)
ARC,Automatic Reference Counting,在iOS5引入。
简单说是代码在编译阶段,由编译器(LLVM 3.0)自动生成实例的引用计数管理的一些代码(插入retain/release等),起到内存管理的作用。
在ARC之前,需要手工管理内存,原则是:
不会!
ARC就是在需要retain和release的地方为你插入它们——这就是ARC和手工管理内存一样快的原因,当然有时ARC还会更快,因为它在后端还进行了一些优化操作。
这里只介绍个ARC使用方法的小子集,即仅记录了我觉得有意思的几个概念原则。ARC使用全集请看Beginning ARC in iOS 5 Tutorial Part 11。
易飞扬对ARC的7篇博文很值得推荐,大家想深入了解ARC原理可以去阅读: iPhone开发之深入浅出,注:要跳墙。
参考文献Beginning ARC in iOS 5 Tutorial Part 1中说:ARC是代表着OC的未来(大概因为ARC之前的内存管理是开发者们曾经的噩梦吧)。A smart developer tries to automate as much of his job as possible, and that’s exactly what ARC offers: automation of menial programming work that you had to do by hand previously. To me, switching is a no-brainer.
技术在不断飞速演进,做工程开发的我们,紧盯技术发展趋势,勇于接受新的东西。
注:第二步中可能需要你有美国账号(其他国家的账号没试过,中国的不行),如果没有美国账号,据说更改系统的语言为英文也行。
下载地址可以去这里
双击安装时,出现下面的对话框:
不双击,而是按住Control键,单击。此时在出现的菜单中选择open。
此时再选择open,就可以啦!
安装完成后进入第二步。
在AppStore页面右下角,有当前国家的标志,点击这里进行切换。点击选择美国后,App Store市场切换到美国:
“128元”的标志不见了,取而代之的是“update”。这时需要你的美国账号了。(没有美国账号的同学试试把系统语言改为英文,据说也行)
选择update,输入美国账号,搞定!
苹果公司让这些产品免费,真挺好,赞一个!
]]>Xcode5使Autolayout技术更容易使用了。 之前,我对Autolayout只是听说有这种机制,但不知原理、用法。于是阅读了下面的两篇文章(作者: Matthijs Hollemans。目前貌似还没有翻译),算是在Storyboard/Xib上会用了。
以下作为阅读笔记,记录应该了解的使用Autolayout的要点(环境是Xcode5,iOS7SDK,Storyboard/Xib)。
这里只介绍Storyboard/Xib使用方式,如果想了解code实现,还要继续阅读其他资料。
理清view想要摆放的位置逻辑(设计),根据这个逻辑来设置Constraints(实现)。比如这个Button要距离那个Button固定20个点的距离,并且两个Button要顶端对齐等。把这些逻辑条件变成constraints,当constraints完备到可以确定view的位置时,就完成了设计和实现。
Autolayout的checkbox默认是check上的,这个配置是对整个Storyboard或整个Xib生效的
可以设置Constraints的地方
1 Editor菜单下的Pin以上的4个菜单
2 在View层次列表中选中Constraints后,在Attributes Inspector中设置
3 最方面快捷的方式是在悬浮在界面编辑右下角的几个图标
蓝色的辅助线:表明Constraints已经足以说明这个view的位置了
橙色的辅助线上的数字:有时是正数,有时是负数。当你设定或更改了Constraints的时候,可能Constraints与界面上你放置的view的位置是不同的。系统会以Constraints为准,界面上提示你橙色辅助线,线上的数字是这个view的位置与Constraints的差距。这时可以在“Resolve Auto Layout Issues”中选择update frame,这样这个view会自动移动到Constraints所指示的地方;也可以update constraints,这时view的位置不变,constraints变为与界面上的view位置一致的数值
对没有提供Constraints的view,系统会自动加上constraints,这些constraints是界面上不可见的。这一点是Xcode5与Xcode4在Autolayout技术升级上最大的改进!Xcode4是系统强加constraints,往往会对开发者进行了干扰,因为强加的Constraints往往不是你想要的。Xcode5的这个改进方便了开发者按照自己的意图去设计和实施:首先不用去修改系统强加的constraints;其次有些view的位置你不需要增加Constraints,就可以不用理会。注:这种自动给View加Constraints的方式只适用于你一个Constraints都没加的情况,如果你加了x方向的,y方向的也需要手动添加。
preview:preview可真方便,你一边在左侧(Portrait、4寸屏)设计实施,一边在preview中看到lanscape的样子或者在3.5寸屏中的样子
以上是一些基础要点,当你用Storyboard/Xib做设计的时候,基本就够用啦。如果觉得这些要点不够,可以参照Matthijs Hollemans在这两篇文章中举的例子,这个例子将带你进行一步步操作。
有些特殊的场景,使用Storyboard/Xib的autolayout是无法实现,需要代码方式的autolayout来实现。代码实现主要围绕着对NSLayoutConstraint对象的操作。具体如何实现,等需要的时候再找时间研究了。
]]>要针对某个UITableView中的Cell做些操作,比如对这个Cell的内容进行查看详细、编辑、删除、或者触发其他功能比如发短信、打电话等,删除、和点击这个Cell在UITableView的Delegate方法中提供,其他的操作就需要识别Cell上的控件(比如Button)对应的action是针对这个Cell的。
一种常用的方式是使用view的层次,在action中找到这个Cell:在
|
|
方法中,把这个Cell的Button加入到Cell的contentView的subView,并且为这个button添加Target。
|
|
之后在对应的
|
|
action中,通过view的层次,去找到对应的Cell:
|
|
在iOS7之后,这样的办法会报错,错误在通过
|
|
的方式,得到的不是cell,所以在这行以下用到cell的地方,就会抛出异常。
原因是在iOS7中,在 UITableViewCell 和 UITableViewCell的ContentView之间,还有一个UITableViewCellScrollView,所以通过两次superview往上“爬”,是爬不到UITableViewCell的。
直观地看,就是向上爬三次superview就行了。为了更好地处理这个问题,应该建立一个UIView的Category(因为这里使用的view的层次superview是UIView的方法),写个Category方法来区分不同情况来得到Cell:
|
|
之后,把
|
|
替换成
|
|
就可以了。
另外一种办法是给控件的tag附上indexPath.row,之后在action中通过tag来得到对应的cell,但如果Cell不是静态的,indexPath.row是会变的。所以这不是一个好的办法。
但我所提供的这个办法,在stackoverflow上有1人给vote down,不知道为什么被vote down。这种办法有什么问题吗?
]]>BB提醒, 做最好的用药提醒工具!
* 可以设置多种重复周期的提醒,例如每3天1次、每1天3次等
* 总有那么几个人,是您在乎的,您很关心他们的健康,不管是治病的药还是保健品,您都希望ta能按时按量想着吃,BB可以让您非常方便地通过微信、短信、电话等多种方式提醒ta!
* 近期提醒列表和历史提醒列表,让您一目了然过去、现在和将来在发生什么。有的时候被动地等待提醒,不如主动地了解情况,不知您是否也有同感?
* 吃了,点一下就标记上了绿色;不打算吃了,想跳过这次,再点一下就标记上黄色;该吃没吃的,会显示红色。有时候知道今天要吃药,但想不起来那会儿到底是吃了还是没吃,这回不必纠结了,BB帮您记着!
* 如果您填写了总药量,BB根据每次用药的情况,自动更新剩余的药量,当剩余药量不足3次时,给出提示
* 开启怕忘模式,BB会按照您设定的时间间隔不停地提醒您,直到打开app才停止。有时候您怕没听见而错过提醒,那就开启怕忘模式吧↖(^ω^)↗
* 开启隐秘模式,提醒您的消息中,不含药品信息。这样不管多个性的铃声都不怕其他人凑上来看了↖(^ω^)↗
* 收录了不少个性铃声,大多数都是我用iTunes剪辑出来的,如果您觉得不好,那就是我的品位太差了,不好意思啊!如果您觉得好,那咱们就是所见略同了↖(^ω^)↗
* 自定义背景图片,可以让BB更温暖、更亲切、更有爱!↖(^ω^)↗
* 这个是在说我啦~我是个上进、充满阳光和正能量的人,熟悉我的朋友都知道,我最擅长的两个字叫“加油”!BB提醒接下来还有很多要改进和升级的地方,也请您提出改进意见,怕忘模式、隐秘模式、个性铃声,都是以前使用“药提醒你”的小伙伴们提出的有爱意见,在这也顺道感谢你们啦!所以,我们一起加油,让BB提醒能够持续改进!
“有些老人或工作过于忙碌的人,有时候响一下,他们可能并不敏感或以为是条普通短信或手头有事直接就忘记了。”
这位同学说的对啊~
预计在2.0版本实现。
恩,听了一下她的解释,我也觉得挺有必要的。
预计在2.0版本实现。
感谢热心反馈的同学们,希望这款用药提醒的工具能够越做越好!
]]>我们刚生下来时,都是白痴,懵懂地看着这个世界。随着一步步地成长,你有了一点一滴的积累,逐渐地,你在某些方面不再是白痴,甚至你成为了那方面的大师。 我们在接触一门新技术的时候,刚开始都是白痴,然后你开始成长,成长可能快、可能慢。最后你可能成为了大师,也可能成为了炮灰。每个人的精力有限,他最多也只能在有限的几个方面成为大师,选好方向很重要,别在每个方向上都成了炮灰。
我现在开始学习iOS开发技术,也就是开始做起了白痴。我想我会比其他人学得慢些,因为我基础相当差,我不是计算机科班出身,而且我只会纯C。没接触过C++、Java这两个打面向对象基础的语言。我还有2年的时间没有接触代码,这两年去做产品经理了。所以这次学习iOS开发技术的起点,算是和一个上过C语言课程的大二同学,差不多。
我想初学iOS开发技术的孩纸们,像我这种水平的还是很多的吧,不然不会有那么多培训公司的做广告了。
当然,培训公司做广告的另外一个原因是这技术简单,入门快,可以速成。这也是我选择这门技术入手的一个原因。我希望用最短的时间,学好一门工程技术,并且能学精通。我猴急,因为自己老大不小,自己还想做个高产的开发者,时间不等我,必须让自己快速成长起来。
我还对自己有个要求,就是要靠自学。这个要求有些过分是不是?又要自己成长得快,又要靠自己学,而且自己还没啥基础,这不是又让马儿跑又不给马儿吃草么?恩,是有难度。对我来讲,从产品转技术,是做了很大的决定,就像原来使用刀,现在决定使用剑,我能不能用好剑,还不是百分百的确定,怎么来确定?就是给我一把剑,舞一舞,上战场砍砍人,看看是胜是败。如果这个过程有人一直帮你拿着剑,你怎么能看出自己用剑的潜力呢?选个自己能做得好的方向很重要,不然小心成为炮灰。
在之前的学习中,我学习了几个控件的使用,也学习了几个OC概念,都做了demo,但觉得这样没法说自己啥时候就算是入了iOS技术的门。咋样能算入门呢?得系统地理解iOS的技术;能娴熟应用;能紧跟趋势。这就入门了。
想入门,首先还是得做一个完整的app,这个完整的app需要是个值得上架的产品。在做这么个产品的过程中,会涉及到iOS技术的方方面面,希望这些方面能较为系统地覆盖iOS技术的体系。
我的这个计划从8月上旬开始,在8月9日完成了产品的设计,8月10~18日对产品可能涉及到的技术点进行了预研,做了些测试,8月19日开始开始开发。在过去的这9天的开发工作中,收获实在是大!每天都要解决很多问题,很多问题的解决方法会让自己加深对iOS相关技术的理解。
这会儿正有个烦心的问题需要找原因和解决方案,我打算take a break,换换脑子,回头想想这几天的收获,会心一笑,于是打算唠叨几句写下来^_^。
想让自己快速进步,就是压迫自己亮亮剑。实际做个产品,对学习iOS技术来讲,非常有帮助。学习其他技术是不是也是一样?我猜可能是,这个等我学习其他技术的时候,再做体会。忽然觉得白眉大侠是挺酷的哈,这左手屠龙刀,右手倚天剑的。希望自己别熬到眉毛都白了,才成为大师……
从现在开始,大师之路,走起~
]]>不用查资料,用过iPhone的同学都知道。iphone中有加速度传感器,可以感知手机在哪个方向上有加速度,比如屏幕的翻转、飞行控制游戏等都是利用这个特征做的;有指南针(貌似叫陀螺仪?),可以知道你的方向;还有定位装置,可以知道你现在的位置在哪里。
加速度传感器相关功能是由CoreMotion提供;指南针、定位信息相关功能由CoreLocation提供。
在CoreMotion.framework中,有下面这些类:
|
|
每个是做什么的,可以在官方文档中阅读,就不在这翻译了。其中实现对设备加速度的识别,主要是使用CMMotionManager。
如何使用CMMotionManager?
Step1:产生一个CMMotionManager的实例mManager。
Step2:实例使用方法isAccelerometerAvailable判断加速度传感器是否可用。
Step3:如果可用,则通过方法setAccelerometerUpdateInterval设定采样频率。
Step4:最后使用startAccelerometerUpdatesToQueue:withHandler开始采样及对采样进行处理。
我在下面的代码中,实现了一个小球在一个框中运动,运动的轨迹是根据手机的倾斜角度计算,运动的方向同倾斜的角度一致,并且倾斜角度越大运动速度越快。 代码下载 在代码的实现过程中,对view的层次有了更深的体会。此外,在给label供数的时候,发现刚好使用代理的方式,算是也对代理做了联系。
着手时,借鉴了这个代码,在编译时遇到了这个问题:
Code Sign error: The identity 'iPhone Developer: Haomian Wang (33P29785DD)' doesn't match any valid certificate/private key pair in the default keychain
原因:
CodeSigning签署的不是你的provisioning,没法在真机上使用。
解决办法:
在TARGETS中的Build Settings里,找Code Signing Identity,里面把不是自己的developer改成自己的provisioning。
注:
借鉴的这份代码是使用acceleroImeter:didAccelerate方法来处理扑捉到的加速度信息,但这个方法已经在iOS5废弃了,现在都使用CoreMotion框架来实现。
编译自己代码时,首先出现了如下错误:
原因:
原因是代码中使用了CoreMotion,但工程中没有添加CoreMotion.framework。这很常见:在使用CoreLocation等framework时,也要想着在工程中添加framework。
解决办法: 在下图处添加CoreMotion.framework
这是个题外话,当时想给工程改个名字,结果改了之后,编译不过。 原因:
原因都是名字、路径更改导致的找不到文件。
解决办法:
改名字注意三点:
iOS的手势,就是程序识别到你在屏幕上做的一些手势动作,做出反应。常见的手势有
其中tap还有单击、双击,Swipe还有向上、下、左、右等区分。
识别这些手势,对每种手势做个反应,没啥难度。下面总结了5个步骤,和几个特殊的地方。
step1: 声明和初始化一个手势识别器
|
|
step2:对手势识别器进行属性设定
|
|
step3:把手势识别器加到view中去
|
|
step4:出现冲突时,要设定优先识别顺序
|
|
step5:去实现处理扑捉到手势之后的动作 填写各个处理函数,如:
|
|
在下面测试代码中,实现了六个手势的处理。 代码下载
在实现的时候,有几个需要注意的地方:
在识别单击双击时,逻辑上应该只有判断非双击时,才判定为单击,否则永远都只会判断为单击;在识别滑动和拖拽时也是一样,应该先判断是否是swipe,不是则才是拖拽,否则都只会识别拖拽。实现方式见上面Step4,使用requireGestureRecognizerToFail方法。
如果你想接受向多个方向的滑动,对每个方向都要声明一个手势,专门代表这个方向的滑动。向左向右就是两个,加上向上向下就是4个。
|
|
然后,你在扑捉到滑动手势之后的处理函数中,去判断UISwipeGestureRecognizer *
类型的recognizer.direction
是属于:
中的哪个,然后再进一步去处理。
]]>使用编码规范是个基础技能,采用谁家的编码规范比较好呢?看你给谁工作了。对OC,苹果、google都有自己的一套编码规范,估计其他公司也都有自己成行的编码规范。
google家写过一个被广泛接受的C++编码规范,他家的oc编码规范是结合了苹果家的oc规范和他自家的c++规范。所以对于iOS新手,我觉得先了解一下苹果家的编码规范比较好。
苹果家的编码规范Coding Guidelines for Cocoa。
简单翻译了下:
做某个事情代码通常都叫这个名字,比如tag、setStringValue,那么你也这么叫。你在不确定怎么起名字的时候,可以参考一些常用的名字:Method Arguments
|
|
前缀一般是2到3个大写之母,可以用来给类、协议、函数、常量、typedef结构起名字时用。但不要给方法用,方法存在的命名空间是类定义的。也不要给结构体的字段使用(the fields of a structure)//没明白是啥意思?
Prefix | Cocoa Framework |
---|---|
NS | Application Kit |
NS | Foundation |
AB | Address Book |
IB | Interface Builder |
1 多个词在一起时,不要使用标点符号(包括下划线、斜杠等),一般词首字母大写即可。
具体到方法名,第一个词首字母小些,后面的词首字母大写,不要用前缀;
fileExistsAtPath:isDirectory:
函数名、常量名使用相关联的类的同样的前缀,后面跟着的词首字母大写。
NSRunAlertPanel NSCellDisabled
2 避免使用下划线来命名私有方法名(要是命名一个实例变量名是可以的),这算是Apple的保留写法,如果使用了可能会和已存在的函数重名。
类名中应该包含一个名词来说明这个类(或者类的对象)是做什么的。并且这个雷鸣应该有个合适的前缀。例如NSString、NSDate、NSButton、UIApplication等等。
协议应该按照他们的行为命名
1 多数协议是一组方法的集合,并不是专门为了某个类服务的。这类协议的命名要区别于类的命名样子,一般都是加个ing
NSLocking | Good |
---|---|
NSLock | Poor (seems like a name for a class) |
2 还有一些协议是把一些没啥关系的方法放在一起,这种协议一般是协助一个类。这种情况下,这种协议可以和类名一样。例子就是NSObject。
1 定义一个独立的类或协议,这时类名和h文件名一样
Header file | Declares |
---|---|
NSLocale.h | The NSLocale class. |
2 定义关联的一些类或协议,一般使用最初最基本的那个类的名字
Header file | Declares |
---|---|
NSString.h | NSString and NSMutableString classes. |
NSLock.h | NSLocking protocol and NSLock, NSConditionLock, and NSRecursiveLock classes. |
3 包含Framework的头文件,使用framework的名字+.h,包含这个framework的公共头文件。
Header file | Framework |
---|---|
Foundation.h | Foundation.framework. |
4 给另外一个framwork中的类增加API时,应该延用原始类的名字。例如NSBundleAdditions.h header file of the Application Kit
5 相关联的函数和数据类型在一起时,使用一个最贴切的名字做头文件。例如NSGraphics.h (Application Kit),包含了相关的函数、常量、结构体、数据类型等。
以上是基础的明明规则,在苹果家的代码规范中,接下来分别介绍了方法命名、函数命名、属性和数据类型命名。新手都应该好好阅读下。
最后还专门为framework开发者提供了一些Tips和Techniques。有兴趣的童鞋也可好好阅读下。
]]>很多前辈有技术博客,及时地阅读他们的著作是个不错的提升自己的方式。此外,很多网站资源也不错,订阅来看很方便。google reader不在了,在mac下,使用什么不花钱的工具阅读RSS呢?
尝试一番后我最后选择了使用免费版的fresh feed。 先后尝试过:
综合来看还是fresh feed好用些。
P.S. 在尝试过程中,安装了获取RSS feed的Safari插件subscribe-to-feed-1-0b4,安装插件后,会出现RSS图标,点击图标后,会在地址栏得到当前safari页面的feed。
]]>delegation[ˌdelɪ’ɡeɪʃn],中文叫委托,是两个类之间传递信息的一种方式。也是一种设计模式。
其作用和实现过程可以这么理解:
A类:A正在工作中发现,有的工作自己做不方便,需要委托别人帮忙做。A要制定个协议,委托的人要遵守这个协议,按照协议中的方法把工作给做了。A的属性有遵守这个协议的delegate,A知道这个delegate会帮助完成协议中的工作。
B类:B会受A委托,B类需要接受这个协议,把协议中的必须执行的方法给执行了。B有个属性是A的对象,在B类中把A的对象的delegate设置成B。
这里提到的协议,即protocol,不熟的孩纸可以仔细阅读协议(Protocol)的用法和代码例子
类之间传递信息可以有多种机制,除了delegation还有notification、observer等方式。一般两个类之间有点儿关系(比如view和subview,view和controller之间,使用delegate)的时候,经常使用delegation;两个模块之间没有啥关系,可能使用notification会更好。有兴趣的孩纸推荐阅读一下When to use Delegation, Notification, or Observation in iOS。
在我们使用控件如textField、textView等时,都会碰到他们的delegation,这是非常好的delegation的例子,要好好去理解delegation的功效。
张老师在外地开会,她会发短信告诉学生代表什么时候让学生们放假,学生代表承诺老师会准确传达。张老师发了短信给学生代表,说7月26日周五大家放假。
张老师是委托人,学生代表是受委托人,她和学生代表定的协议中的方法:由学生代表告诉学生们什么时候放假。 张老师发短信给学生代表这个时候会触发他们之间协议的方法。
测试代码中有老师和学生代表两个类,输出的结果见NSLog。代码下载
]]>