2013年10月26日星期六

ios6 dispatch_release arc


http://stackoverflow.com/questions/8618632/does-arc-support-dispatch-queues/8619055#8619055




If your deployment target is lower than iOS 6.0 or Mac OS X 10.8

You need to use dispatch_retain and dispatch_release on your queue. ARC does not manage them.

If your deployment target is iOS 6.0 or Mac OS X 10.8 or later

ARC will manage your queue for you. You do not need to (and cannot) use dispatch_retain ordispatch_release if ARC is enabled.

Details

Starting in the iOS 6.0 SDK and the Mac OS X 10.8 SDK, every dispatch object (including adispatch_queue_t) is also an Objective-C object. This is documented in the header file:

2013年10月25日星期五

error: Not a JPEG file: starts with 0xff 0xd9

通过ASIHttpRequest 下载的图片文件保存到 path 里面
然后

UIImage *myImage = [UIImage imageWithContentsOfFile:path];

然后对 myImage 进行处理或者保存 就会报错,直接导致app crash




采用上面的处理方式,终于解决了问题

UIImage *myImage = [UIImage imageWithContentsOfFile:path];
to
NSData *img = [NSData dataWithContentsOfFile:path];
UIImage *photo = [UIImage imageWithData:img];

ASIHTTPRequest 下载文件

对于大文件的下载,不能直接保存到data里面,因为如果文件很大必然会导致内存不足,进而导致app crash。

可以使用 ASIHTTPRequest 下载文件,下载的时候直接写入disk里面,这样就会避免内存不足的问题。

如以下 code:






上面下载文件的时候 采用了request startAsynchronous ,采取了异步的方式,这样导致了每一次http接收的data,都会起一个线程 来打开 file,然后写入file,这样会导致效率降低,进而会下载速度变慢


然后我改成了,采用 同步的方式,下载速度大大加快





没有时间查看 ASIHTTPRequest 在下载到文件的内部机制,姑且这样认为

以后在下载文件到路径的时候,直接采用 [request startAsynchronous];




2013年10月15日星期二

UITextField 常用


1、UITextField 默认的文字是紧贴着 textfield 的边缘的,如果使文字与边缘之间加点空隙

Override下面的两个方法即可

// placeholder position
- (CGRect)textRectForBounds:(CGRect)bounds {
     return CGRectInset( bounds , 10 , 10 );
}

// text position
- (CGRect)editingRectForBounds:(CGRect)bounds {
     return CGRectInset( bounds , 10 , 10 );
}


2、Set the maximum character length of a UITextField


- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    NSUInteger newLength = [textField.text length] + [string length] - range.length;
    return (newLength > 25) ? NO : YES;
}

3、上面2中的方法 再加上 UITextFieldTextDidChangeNotification 才能很准确的及时得到长度










2013年10月10日星期四

CCRenderTexture clear transparent white

Cocos2d 2.0

CCRenderTexture 调用 clear 之后,变成不透明的了

需要 CCRenderTexture 设置下面属性


[renderTexture.sprite setBlendFunc:(ccBlendFunc){GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA}];


再次调用 clear 即可
[_renderTexture clear:1 g:1 b:1 a:0];

2013年10月9日星期三

Safari不能使用自动代理PAC


OS X 之后,Safari由于其沙盒机制的原因无法使用本地PAC文件,可通过Web Sharing或将PAC文件放在服务器,然后通过http访问。

GenPAC 代理

http://jeeker.net/projects/genpac/


  由于众所周知的原因,中国大陆地区访问国外资源总会遇到些不便,于是“翻墙”成了有意了解真实世界的内地网民所必须掌握的一项技能,本人也是如此,先前使用Proxy Switchy!,可惜在Mac OSX Lion后就无法正常使用,其开发者不知为何也停止了更新,此后找到的AutoProxy2PAC 也有这样那样的问题,最恶心的是居然莫名其妙还使用base64编码,让有“窥探欲”的我实在无法忍受。
  于是本着自力更生、丰衣足食的精神,就有了这个代理自动配置生成工具 GenPAC (PAC Generator)。
  • 基于Python 2.7
  • 代理规则基于gfwlist
  • 支持用户自定义规则
  • 生成时允许配置使用代理,防止获取gfwlist时被墙
要求
  • Python 2.7
  • 可用的代理服务器
下载
  • git clone https://github.com/JinnLynn/genpac.git
  • 直接下载 https://github.com/JinnLynn/genpac/archive/master.zip
安装
  • $ cd genpac
  • $ ./setup.py install #可能需要root权限
  • $ genpac -v
或者也可以直接使用命令
  • $ cd genpac
  • $ ./genpac -v
命令帮助
  • genpac [-h|--help] [-v|version] [--verbose]
  •       [-p PROXY|--proxy=PROXY]
  •       [--gfwlist-url=URL] [--gfwlist-proxy=PROXY]
  •       [--user-rule=RULE] [--user-rule-from=FILE]
  •       [--config-from=FILE] [--output=FILE]
  •  
  • 可选参数:
  •   -h, --help                显示帮助内容
  •   -v, --version             显示版本信息
  •   --verbose                 输出详细处理过程
  •   -p PROXY, --proxy=PROXY   PAC文件中使用的代理信息,如:
  •                               SOCKS 127.0.0.1:9527
  •                               SOCKS5 127.0.0.1:9527; SOCKS 127.0.0.1:9527
  •                               PROXY 127.0.0.1:9527
  •   --gfwlist-url=URL         gfwlist地址,一般不需要更改,默认: 
  •                               http://autoproxy-gfwlist.googlecode.com/svn/trunk/gfwlist.txt
  •   --gfwlist-proxy=PROXY     获取gfwlist时的代理设置,如果你可以正常访问gfwlist,则无必要使用该选项
  •                             格式为 "代理类型 [用户名:密码]@地址:端口" 其中用户名和密码可选,如: 
  •                               SOCKS5 127.0.0.1:9527
  •                               SOCKS5 username:password@127.0.0.1:9527
  •   --user-rule=RULE          自定义规则,该选项允许重复使用,如:
  •                               --user-rule="@@sina.com"
  •                               --user-rule="||youtube.com"
  •   --user-rule-from=FILE     从文件中读取自定义规则,该选项允许重复使用
  •   --config-from=FILE        从文件中读取配置信息
  •   --output=FILE             输出生成的文件,如果没有此选项,将直接打印结果
配置
支持通过--config-from参数读入配置信息,配置文件书写方法可参考sample/config.ini
自定义的代理规则
支持通过--user-rule自定义单个规则或--user-rule-from读入自定义规则文件,这两个参数均可重复使用。
自定义规则文件可参考sample/user-rules.txt
自定义规则的语法与gfwlist相同,使用AdBlock Plus过滤规则( http://adblockplus.org/en/filters ),简述如下:
  • 通配符支持,如*.example.com/* 实际书写时可省略*.example.com/
  • 正则表达式支持,以\开始和结束, 如\[\w]+:\/\/example.com\\
  • 例外规则 @@,如@@*.example.com/* 满足@@后规则的地址不使用代理
  • 匹配地址开始和结尾 |,如|http://example.comexample.com|分别表示以http://example.com开始和以example.com结束的地址
  • || 标记,如||example.comhttp://example.com https://example.com ftp://example.com等地址均满足条件
  • 注释 !! Comment
配置自定义规则时需谨慎,尽量避免与gfwlist产生冲突,或将一些本不需要代理的网址添加到代理列表
规则优先级从高到底为: user-rule > user-rule-from > gfwlist
PAC文件的使用
如何使用自动代理请自行Google,需要说明的是Mac OSX Lion下的Safari由于其沙盒机制的原因无法使用本地PAC文件,可通过Web Sharing或将PAC文件放在服务器,然后通过http访问。
LICENSE
The MIT License.


2013年10月5日星期六

GL_LINE_SMOOTH 真机无效果

opengles 1.x
opengl中 GL_LINE_SMOOTH 用于 线的抗锯齿

glEnable(GL_POINT_SMOOTH);
glEnable(GL_LINE_SMOOTH);
glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); // Make round points, not square points
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); // Antialias the lines


在 模拟器 上运行的时候,有抗锯齿的效果。

但 真机 上运行的时候,没有任何效果。
应该是为了 手机和ipad端 运行的性能,在真机上才没有开启这种效果。


1、在Apple移动设备中使用多重采样
在原先的OpenGL ES中并没有多重采样的接口,Apple为我们扩充了能够用于多重采样的OpenGL ES扩展接口。

2、使用纹理

cocos2d 1.x ARC

http://www.cnblogs.com/dqshll/archive/2012/08/27/2658303.html

该文介绍的方法是,将cocos2d作为单独的工程编译(无arc),将库文件引用到enable ARC的工程中,稍加修改即可.
但是回复中有更简单的方法(这个回复的人也真够不客气的,有兴趣去看一下horseshoe7的回复).个人实操步骤如下:
注意:
  - 如果你用cocos2d v2.0以后的版本,那么你有福了,4,5,6,7都不会出错,可跳过
  - 如果你用cocos2d v1.1,那么你只会碰到4的问题,5,6,7可以跳过.
  - 如果你和我一样用了1.0.1,那么就必须修改下述所有地方. 
1. 使用LLVM: 在build setting中设置默认编译器,搜"LLVM", 选Apple LLVM compiler 3.1
2. enable ARC: 上述界面,搜auto, 将Object C Automatic Reference Counting设为Yes.
3. complie source build phase中有列出所有的.m文件,复选中cocos2d的那些文件,回车,输入"-fno-objc-arc",回车. 这样,这些文件就不会被ARC检查. 建议将cocos2d自己生成的AppDelegate.m和RootViewController.m都关ARC.只在自己的代码中使用ARC.
4. 然后编译一把,会发出现很多 CCArray相关的error了, 这些来自于CCArray这个结构体的头文件里,它用到了好多inline的函数,LLVM编译器不认.所以要把这些文艺函数都改为普通函数,而且不能放在头文件里,要放在m文件里,这样就要自己加个ccCArray.m文件.代码都在ccCArray.h里,自己挪代码?多麻烦.其实不用自己改.答案就在cocos2d v2.0里,因为v2全面支持ARC了,所以cocos2d都帮你改好了.去下载一套v2的代码,把ccCarray.h和.m这两个文件copy过来,覆盖.h文件,将.m文件添加到你的工程里,再编译.warning消失了,但是出来几个link error.不要紧,是因为cocos2d v2改了两个函数名字.到CCArray.m中,找到 insertionSort 和 mergesortL,在前面加上个cc_,编译吧,CCArray的就编过了.
5.ccMacro.h 把v1.1里ARC Macros那三个宏定义merge过来.ccCArry.m里有用到.
6. 在CCDirectorIOS.h中,将CCDirectorFast函数的里的NSAutoreleasePool那一句去掉.在对应的CCDirectorIOS.m文件中加入如下一句
static NSAutoreleasePool *autoreleasePool = nil;
其实就是把变量改为静态的.
7.  CCActionManager.h里的结构体tHashElement会报错.替换成
typedef struct _hashElement
{
struct ccArray *actions;
__unsafe_unretained id target;
NSUInteger actionIndex;
__unsafe_unretained CCAction *currentAction;
BOOL currentActionSalvaged;
BOOL paused;
UT_hash_handle hh;
} tHashElement;
8. 至此,就只剩下把自己的代码中的错误了: xcode有工具可以转,菜单选Edit/Refactor/Convert to Object C ARC, 选中要转换文件,转之.xcode会让你看一眼那些地方删掉了,自己看一下,基本上就是去掉了dealloc,retain,release这些东西.因为ARC会自动为你生成.好了,这样以后再编译,就没有error了.

2013年10月4日星期五

opengl opengles

OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于生成二维、三维图像。这个接口由近三百五十个不同的函数调用组成,用来从简单的图元绘制复杂的三维景象。主要用于pc和工作站。


OpenVG是针对诸如Flash和SVG的矢量图形算法库提供底层硬件加速界面的免授权费、跨平台应用程序接口API。也是由OpenGL的拥有者khronos公司提出的。OpenVG 现仍处于发展阶段,其初始目标主要面向需要高质量矢量图形算法加速技术的便携手持设备,用以在小屏幕设备上实现动人心弦的用户界面和文本显示效果,并支持硬件加速以在极低的处理器功率级别下实现流畅的交互性能。

但是android中2D向量图形函数库并没有使用OpenVG,而是使用了Google在05年收购的一家公司提供的引擎叫skia。它可以搭配OpenGL/ES与特定的硬体特征,强化显示的效果。综上,2D图形硬件无需支持OpenVG。




OpenGL ES (OpenGL for Embedded Systems) 是一个针对嵌入式应用的,免费的,支持全功能2D、3D的跨平台API(OpenGL® ES is a royalty-free, cross-platform API for full-function 2D and 3D graphics on embedded systems - including consoles, phones, appliances and vehicles)。

OpenGL ES 1.0 是以 OpenGL 1.3 规范为基础的,OpenGL ES 1.1 是以 OpenGL 1.5 规范为基础的,1.1完全兼容1.0。OpenGL ES 2.0 则是参照 OpenGL 2.0 规范定义的。简单的来说,OpenGL ES是OpenGL针对嵌入式应用的简化版,也就是android使用的标准。OpenGL ES 1.1强调api的硬件加速,OpenGL ES 2.0更强调3D能力。

OpenGL ES 1.1和OpenGL ES 2.0之间的关系并不是旧版本和新版本之间的差别,而是一个针对相对低端的应用,一个针对高级应用,OpenGL官方的roadmap也是将这两个版本并行发展的。2.X并不能百分百兼容1.X。

opengl es 2.0和opengl es 1.0相比更具灵活性,功能也更强大。可以自定义顶点和像素计算,可以让表现方式更加准确。如果要执行同样的运算,用opengl es 1.1通常需要几个渲染pass,复杂的状态设置,算法也更简单明了。shader确保了你能够更准确,清晰地执行运算,并且性能更佳。opengl es 2.0需要更多前台的工作(shader),而这些工作,opengl es 1.1都帮你做好了。

opengl es 1.1提供了一个标准的固定渲染管线,这个管线为3d程序提供了提供了很好的参照(如何编写渲染语言)。如果你对程序没什么太大要求,opengl es1.1不需要太多的代码就可以实现了;如果你要求程序在所有设备在都能良好运行,那么应该选择用opengl es 1.1(主要是可以兼容旧设备)。但是在新的ios设备上,如果用opengl es 2.0将发挥它们强大的图形渲染能力。


OpenGL ES 1.0 vs OpenGL ES 2.0
如果你刚刚接触OpenGL ES 编程,下面是OpenGL ES 1.0 和 OpenGL ES 2.0的差别:
-OpenGL ES 1.0使用一个固定的管线,这是一个好方法(fancy way),说明你在使用内建函数设置光、顶点、颜镜头,和其他。
-OpenGL ES 2.0使用一个可编程的管线,这是一个好方法,说明你没有使用任何内建方法,你需要自己写全部的东西。
“OMG!”你可能会想“如果只是增加了额外的工作量,我为啥要还要用OpenGL ES 2.0?!”,尽管确实增加了额外的工作量,使用OpenGL ES 2.0你可以做出一些非常酷的效果。


Android现在支持1.X和2.X。
对于我们的应用来说,选择OpenGL ES 1.1已足够。理由如下:

1. 1.1就能达到甚至略超过PSP的效果了(PSP实际上是一个PS2的简化版,它也不支持vertex或pixel shader)。2.x能达到更好的效果(大约接近DX9)。毕竟无论是以掌机(或者手机等便携设备)的耗电量,成本,还是屏幕尺寸来看,1.x都更有优势。jsr184标准的硬件实现就是ES_1.x。

2. 如果追求最顶尖和图形质量和效果,定位为高端产品,那么就可以选择2.0,但成本和开发周期会很高。基本上2.x的接口是针对游戏主机而非掌机设计的,据说PS3就采用了ES_2.x。

3. android的目标应用不仅仅是手持设备,它的野心以后会触伸到游戏机甚至桌面等更为高端的领域,所以它现在支持更为高级的2.X。但是对于我们芯片的定位,如果选择支持OpenGL ES的IP。支持OpenGL ES 1.1足矣。

Tengine

Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。


从2011年12月开始,Tengine成为一个开源项目,Tengine团队在积极地开发和维护着它。Tengine团队的核心成员来自于淘宝搜狗等互联网企业。


土豆网 采用的是 Tengine



下面摘自taobao的Tengine主页的特性