XCode 4免证书真机调试

本文转载总结自世界各地,如有侵权还请见谅.

目前可以保证是最简便的方法

方法如下:

  • 创建证书,这里不多说了,直接参考这里创建证书的步骤,不要做除创建证书以外的工作
  • 终端: sudo /usr/bin/sed -i .bak 's/XCiPhoneOSCodeSignContext/XCCodeSignContext/' /Developer/Platforms/iPhoneOS.platform/Info.plist (其实就是把这个Info.plist中所有XCiPhoneOSCodeSignContext改成XCCodeSignContext,手动替换也可以)
  • 修改项目配置里面的TARGETS:选择ALL找到Code Signing Identity,选择iPhone Developer (这里说的不太明白,大家试一下就知道了)

此时你应当重启下XCode尝试一下是否可以通过真机运行(此时应当是app能装到真机上但是会出现一个错误不能debug,程序也没运行,但是可以像正常应用一样点击运行了,要想可以debug应当做最后一步的工作)

  • Xcode的File菜单上,File >> New >>New File >> iOS >> Code Signing >> Entitlements 新建一个Entitlements.plist,然后在之前修改TARGETS的地方找到Code signing Entitlements,键入:  ./你的项目名/Entitlements.plist(这个路径取决于Entitlements.plist的位置) ,接着运行试试吧!

PS. 如果仍未成功,回复中的内容可能对你有帮助。

–以上–

在iPhone/iPad/iPod上查看iOS文档

7.26更新:iPad基本不用看了,拿模拟器试了下发现官方文档对iPad支持甚好,而离线版缺少对iPad的支持,无法通过Safari打开

苹果的官方文档甚是强大,对开发的各个方面都进行了及其详尽的介绍,作为开发者当然要时常翻看,本地的文档只能在电脑上看,要想用我们的iDevices查看文档只好连网看在线版的,但由于网速限制不够有效率,官方文档虽然支持转换成PDF,但是转换速度很慢,转换后一堆超链接也失效了.另外我找了好久也没有一个叫"Procket Documentation"或者类似的App,实在有些遗憾.

这里有一个不太完美的解决方案:官方文档虽然都是docset格式的,但其实右键显示包内容一看就是一堆html,css啥的,和在线版的文档一样完全可以用浏览器解决,所以只要把docset里面的Documents文件夹拖到你的iDevices里面就行了,如果你没有越狱就用GoodReader啥的看吧,不过我用iPhone 4测试效果不太理想,文档首页加载奇慢,而且显示不全,那个搜索不知道好不好使,太卡没法测试,iPad 2不知道效果能怎么样,有iPad 2的同学试验下最好在评论中说下效果,别的页面也可以直接浏览,不过效果没有桌面版的Safai那样好,排版似乎有些问题(不是大问题,试下就知道了),但是不影响看.

如果越狱了,可以在Cydia里搜索下lighttpd,安装,最好也安装一下Lighttpd SBSetting Toggle,安装后重启,然后就可以用Safari访问127.0.0.1了.(这里只介绍下安装那个Toogle后的使用方法,Lighttpd SBSetting Toggle的说明中提到webroot地址是/var/www,配置文件是/etc/lighttpd2.cong,用默认的配置文件访问127.0.0.1就可以直接看到/var/www下的目录.只要把之前提到的Document文件夹放这里就行了,接下来怎么做就不用说了吧.) 用自带Safari打开文档,文档首页依旧很卡,但是比GoodReader强多了,而且搜索也勉强可以用(iPhone 4测试,其他不知效果如何),其他页面和GoodReader浏览效果一样,都是排版有点问题,不影响效果.

目前为止也没做太多测试,现在正考虑用其他浏览器看看效果是否能好些(Operamini试了下根本不行),如果有发现就会更新这篇文章,没有就这样了.

其实这个方法也可以用来查看Android文档什么的.

–以上–

PS:搜狗输入法Mac版真TM2(Ver 1.1),中文标点那个选项没有记忆,切个输入法就又回到默认值了,写这篇文章净折腾全角半角的问题了.另外所谓的词库也就那回事,跟Win版没法比.

Mac下iTunes评星全局快捷键设置

估计看这篇文章的都是习惯用iTunes播放音乐并通过评价歌曲的星级(就叫评星吧)来帮助自己筛选喜欢的歌曲.当我们工作或娱乐的同时用iTunes播放音乐的时候不免要对歌曲进行评分/星,一般的方法实在是很麻烦,这里教大家一个添加全局快捷键的方法,帮助你在所有程序下都能方便地为你的歌曲评星.步骤如下:

  1. 打开"Automator"
  2. 模版中选择"服务"
  3. 资料库中选择"实用工具",然后在右边的列表中双击"运行AppleScript"添加到工作流程中(也可以通过搜索直接找到这一项)
  4. 用如下代码覆盖原来的代码:
      tell application "iTunes"
      set the rating of current track to 20
      end tell
  5. 上面的"服务接收选定的"后面的下拉列表选择"没有输入"
  6. 保存并命名为"Rate as 1" (名字随你喜好)
  7. 4中的代码"20"改成"40", 另存为"Rate as 2",以免把第一覆盖了
  8. 依次类推把"20"分别改成"60""80""100",另存
  9. 打开"系统偏好设置" >> "键盘" >> "键盘快捷键"
  10. 左边列表里面选择"服务",然后在右边列表里就能找到你刚刚存储的那几个服务
  11. 分别给这几个服务设置快捷键,注意不要和其他快捷键冲突,我设置成了⌘⌥⇧+1/2/3/4/5
  12. 大功告成,测试一下吧,有问题留言
  13. 一点说明:20 40 ….分别表示1星 2星 … 如果想设置半星那么就用10,30…这些值

Extras:

继续阅读Mac下iTunes评星全局快捷键设置

关于initWithCoder导致的内存泄露

initWithCoder一般是通过[NSUnarchiver unarchiveObjectWithData:NSData]调用的, 虽然我们可能感觉代码写得没有什么问题, 但用Performance Tool检测还会有leak. 如果你确定自己的代码没有任何问题, 那么就可以无视Performance Tool的检测. 之所以会检测到内存泄露, 一个可能的原因就是unarchiveObjectWithData:返回的是一个autorelease对象, 而在Performance Tool检测时, autoreleasePool还没有释放, 因此我们可以尝试直接在unarchiveObjectWithData:这个方法附近范围新建一个autoreleasePool然后release它(参考main.m中autoreleasePool的创建和release), 如果Performance Tool不再提示内存泄露, 那么就证明的确没有内存泄露了.

可以参考这里的讨论

–以上–

Objective-C: delegate的那点事儿

Delegate算是Objective-C的一大特性, 关于Delegate的基础就不多介绍了, 有兴趣的请参看文档.

这里仅对Delegate使用中的一些问题做点讨论

我们用Delegate很多情况下是基于多线程的,比如我们有一个ViewController在这个Controller里面进行了一个下载图片的操作,下载成功后需要通过protocol来现实下载成功, 但是当ViewController已经被release,而下载工作才结束, 那么下载工作的[delegate didFinishDownload] (暂且就这么命名吧) 就会产生一个异常,因为你给一个deallocated的对象发送了一个消息.

那么,如何解决这个问题呢,首先我们可能想到用if (delegate == nil) 来判断delegate是否存在,但其实这是不行的,因为已经dealloc的对象并不是nil.要知道Objective-C中给nil发送消息是可以的,所以如果这种方法可行,其实我们就根本不需要if这句,[delegate didFinishDownload] 给nil发送了一个消息也不会出现异常,因此这种方法只是重复了上面的错误.

还有一个叫[delegate respondsToSelector:SEL]来判断delegate是否响应一个Selector, 根据上一段的描述,我们也可以判断出这个也是不行的.这里额外提一点关于respondsToSelector的东西,要使用这个方法,必须有@protocol MyProtocol <NSObject>,因为respondsToSelector是NSObject的一个protocol方法.

既然要防止delegate被release,那么retain这个delegate是否可行呢?这么做虽然避免错误的发生,但是也产生了另一个问题,这就关系到Objective-C内存管理中的Retain Circle, 即:有A,B两个Object, A中有一个B的实例变量,B中又有一个A的实例变量,要release A就必须releaseA中的B,而要release B有必须release B中的A,这样就产生了一个Retain Circle,A B都不能被dealloc.解决Retain Circle的方法就是使用弱引用(weak reference),弱引用没有被引用的那个Object的所有权,也就不需要release它,从而解决了Retain Circle问题.为了防止Retain Circle的发生, delegate通常都是弱引用的, 因此我们一般不应该retain一个delegate.但是似乎有一个例外:NSURLConnection, 网上对其的讨论结果是:NSURLConnection会retain它的delegate,详细可以参考StackOverflow上的这个问题

似乎没有简单可行的方法来解决这个问题(至少在本文发表时我还没有找到),那么我们只能在通过程序结构的设计来解决这一问题了,对应不同的程序自然也就有不同的解决方法,我想到的一种就是在这个ViewConrtoller被release的时候,把下载方法中的delegate设置成nil即可(目前测试可行, 如有错误还请指正).

更新几种解决方法:

–以上–

UITableViewCell的selecte与deselect

首先要从一个我遇到的问题谈起,一个基于NavigationBar的App,开始时我有一个UITableViewController,其中每个UITableViewCell点击后都会push另一个ViewController,每次点击Cell的时候,Cell都会被选中,当从push的ViewController返回的时候选中的Cell便会自动取消选中(有动画效果)。后来由于某些原因我把这个UITableViewController改成了UIViewController,之后就产生了一个问题:每次返回到TableView的时候,之前选中的Cell不能自动取消选中,经过查找得知:

UITableViewController有一个clearsSelectionOnViewWillAppear的property,

而当把UITableViewController修改成UIViewController后,这个属性自然就不存在了,因此我们必须手动添加取消选中的功能,方法很简单,在viewWillAppear方法中加入:

[self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES];

即可,估计UITableViewController也是用类似的方法来实现取消选中的功能的。

–以上–

让iPhone打开蜂窝数据后能立即联网

3G用户或者网络流量充足的就跳过吧,像我们这些每月只有30M流量的移动用户来说,蜂窝数据当然是要到用的时候才打开,但是估计大家都有同一个问题,就是蜂窝数据打开后还是不能立即联网,正常的话需要等待一段时间(具体我也不知道有多长,至少30‘’吧,我没等过),想要快点的话有一下几个方法:

  1. 修改一次apn,改成一个错的或者其他的,再修改回来(我一直是cmnet改成cmne,再该回来)
  2. 关、开一次飞行模式,这个其实比较慢,毕竟重新搜索一次网络
  3. 开关一次数据漫游,这个是相对来讲最快的,我今天才发现的方法,推荐使用。

使用上面的方法应该有立竿见影的效果,适合非越狱用户,越狱用户完全可以装sbsettings来更快的搞定,要实现数据漫游开关还要装个插件,cydia里面找Data Roaming  Sbsettings 安装即可,此外还可以把Push Mail 还有 Push Notifications Toggle一起装上,方便关闭邮件推送、和通知(其实也是推送),防止跑流量,完成后,上网就方便多了,整个过程2-3秒就搞定,方便快捷。

另外可能有人纠结到底使用Activator还是QuickDo,个人感觉Activator似乎功能更多一点,而且是免费的,当然选择这个了。个人观点而已,各位还是按自己的喜好决定吧。

–以上–

XCode SVN 设置指南

经初步测试,使用本文的方法,可以解决文件丢失,commit错误(Error: 155005  Working copy not locked..等)等问题

  • 修改svn配置文件
svn的配置文件在~/.subversions/config
修改方法:
1.找到 global-ignores 一行,去掉注释用的“#”,编辑(添加)成 global-ignores = build *~.nib *.so *.pbxuser *.mode *.perspective*
2.找到 enable-auto-props = yes 把注释去掉(这步似乎可以忽略)
3. 在[auto-props] Section添加以下内容
     *.mode* = svn:mime-type=text/X-xcode
     *.pbxuser = svn:mime-type=text/X-xcode
     *.perspective* = svn:mime-type=text/X-xcode
     *.pbxproj = svn:mime-type=text/X-xcode
 
关于修改配置文件的更多讨论在这里
 
  • SCM Config
XCode 菜单中 SCM >> Configure Repositories
 
按 “+” 添加一项
     Name:任意
     URL:svn://[email protected]/opt/ibmtc/SUBPATH 然后按tab切换 下面那几个除了Password都自动填好了
     Scheme: svn
     Host:svn.footoo.org
     Path:/opt/ibmtc/SUBPATH
     User: USERNAME
     Password: PASSWD
下面有个指示灯,如果显示绿色并有Authenticated字样则表示设置成功
  • 添加项目
1. 如果不是新建的项目 直接到第二步 SCM >> Repositories 选择好对应目录 点Import选择想要进行版本控制的项目(最好是“干净”的项目 即没有.svn文件夹 否则可能有一些错误)
2. 在刚才的窗口选择刚添加的项目 Check out,相当于用svn对项目进行初始化,加入一些控制信息。这一步很重要,缺失了将不能进行版本控制
3. 打开Check out下来的项目 打开项目属性窗口 >> General >> Config Roots & SCM…  下拉按钮选择Subversion 下面的table中的Repository选择你之前在Configure Repositories中添加的那个,一般都会有Recommended字样
 此时在菜单 SCM中就多出了很多项目
在左边的项目树中,邮件点击表头,选择SCM可以多出一栏现实项目修改信息
文件的标示状态简介如下: 

Cocoa中的weak reference

以下所有内容翻译自官方文档,如有不当之处还请各位指正。

Weak Reference to Objects(弱引用)

————————————————————————————————————

retain 一个 object 创建一个 “Strong” reference,一个object在直到它所有的strong reference都release了之后才能dealloc,因此object的生命周期是受它的Strong reference的所有者控制的。某些情况下,这种行为不是我们所期待的,你也许想有一个不会阻止一个object dealloc的reference,这种情况下,你就拥有一个“Weak” reference,weak reference是通过存储一个不retain相应的object的指针所创建的。

 
weak reference在会有循环reference要创建时是必要的。比如,如果Object A和 B之间互相Communicate,它们各自需要一个对方的reference。如果它们各自retain了对方,那么直到它们之间的Connection切断之前它们之中任何一个都不会dealloc,但是它们之间的Connection要等待它们其中任意一个dealloc了之后才能切断,这就产生了一个矛盾。要解决这个问题,其中一个object作为一个次级(subordinate)角色并且拥有对方的一个weak reference。一个具体的例子,在一个view继承体系中,一个parent view拥有并因此retain他的childe views,但是一个child view不拥有它的parent;而又必须知道它的parent是谁,所以就有一个指向它的parent的weak reference。
 
Cocoa中另一些weak reference的例子包括但不局限于这些:table data sources,outline view items,notification observers,各种targets和delegates。(比如一个NSTableView不会retain它的data source,一个NSApplication不会retain它的delegate)
 
当你需要向一个你只拥有weak reference的object发送消息时,就要小心,那个object是不是已经dealloc了,如这这样会使你的程序Crash。
后面又是一些例子(delegate 和notification),不翻译了。

国内各大视频网站广告屏蔽方法

方法已过期

火星惯例,先吐槽:最近youku啥的广告真文明用语的越来越不要脸了,神马破观音山的广告看了不下800遍,要是youtube还在的话国内哪个视频网站敢如此嚣张,不就推出了个“超清”么,真好意思说,算了进入正题吧。

可能大家也有别的插件什么的屏蔽广告的方法,但是修改host终究是最环保的,打开host添加如下代码(Mac用户请把中文删除,或者改成英文,不然有编码问题不能保存)

 

#优酷
0.0.0.0 stat.youku.com
0.0.0.0 static.lstat.youku.com
0.0.0.0 valb.atm.youku.com
0.0.0.0 valc.atm.youku.com
0.0.0.0 valf.atm.youku.com
0.0.0.0 valo.atm.youku.com
0.0.0.0 valp.atm.youku.com
0.0.0.0 vid.atm.youku.com
0.0.0.0 walp.atm.youku.com
 
#去奇艺广告
127.0.0.1 afp.qiyi.com
127.0.0.1 focusbaiduafp.allyes.com
#CNTV
127.0.0.1 a.cctv.com
127.0.0.1 a.cntv.cn
127.0.0.1 ad.cctv.com
127.0.0.1 d.cntv.cn
127.0.0.1 adguanggao.eee114.com
127.0.0.1 cctv.adsunion.com
#新浪视频
127.0.0.1 dcads.sina.com.cn
#pptv
127.0.0.1 pp2.pptv.com
#乐视
127.0.0.1 pro.letv.com
#搜狐高清
127.0.0.1 images.sohu.com
@HostsX 国内站点广告/视频类网站
#CNTV
127.0.0.1 a.cctv.com
127.0.0.1 a.cntv.cn
127.0.0.1 ad.cctv.com
127.0.0.1 d.cntv.cn
127.0.0.1 adguanggao.eee114.com
127.0.0.1 cctv.adsunion.com
#我乐网
127.0.0.1 acs.56.com
127.0.0.1 acs.agent.56.com
127.0.0.1 acs.agent.v-56.com
127.0.0.1 bill.agent.56.com
127.0.0.1 bill.agent.v-56.com
127.0.0.1 stat.56.com
127.0.0.1 stat2.corp.56.com
127.0.0.1 union.56.com
127.0.0.1 uvimage.56.com
127.0.0.1 v16.56.com
#6间房
127.0.0.1 pole.6rooms.com
127.0.0.1 shrek.6.cn
127.0.0.1 simba.6.cn
127.0.0.1 union.6.cn
#土豆网
127.0.0.1 adextensioncontrol.tudou.com
127.0.0.1 iwstat.tudou.com
127.0.0.1 nstat.tudou.com
127.0.0.1 stats.tudou.com
127.0.0.1 *.p2v.tudou.com*
127.0.0.1 at-img1.tdimg.com
127.0.0.1 at-img2.tdimg.com
127.0.0.1 at-img3.tdimg.com
127.0.0.1 adplay.tudou.com
127.0.0.1 adcontrol.tudou.com
127.0.0.1 stat.tudou.com
#酷6网
127.0.0.1 1.allyes.com.cn
127.0.0.1 analytics.ku6.com
127.0.0.1 gug.ku6cdn.com
127.0.0.1 ku6.allyes.com
127.0.0.1 ku6afp.allyes.com
127.0.0.1 pq.stat.ku6.com
127.0.0.1 st.vq.ku6.cn
127.0.0.1 stat0.888.ku6.com
127.0.0.1 stat1.888.ku6.com
127.0.0.1 stat2.888.ku6.com
127.0.0.1 stat3.888.ku6.com
127.0.0.1 static.ku6.com
127.0.0.1 v0.stat.ku6.com
127.0.0.1 v1.stat.ku6.com
127.0.0.1 v2.stat.ku6.com
127.0.0.1 v3.stat.ku6.com
#激动网
127.0.0.1 86file.megajoy.com
127.0.0.1 86get.joy.cn
127.0.0.1 86log.joy.cn
#天线视频
127.0.0.1 casting.openv.com
127.0.0.1 m.openv.tv
127.0.0.1 uniclick.openv.com
#迅雷看看屏蔽:
127.0.0.1 mcfg.sandai.net
127.0.0.1 biz5.sandai.net
127.0.0.1 server1.adpolestar.net
127.0.0.1 advstat.xunlei.com
127.0.0.1 mpv.sandai.net
 
host怎么改就不说了,各位自行了断
 
–Fin–