04 2012 档案
摘要:由于url支持26个英文字母、数字和少数几个特殊字符,因此,对于url中包含非标准url的字符时,就需要对其进行编码。iOS中提供了函数stringByAddingPercentEscapesUsingEncoding对中文和一些特殊字符进行编码,但是stringByAddingPercentEscapesUsingEncoding的功能并不完善,对一些较为特殊的字符无效。而对这些字符则可以使用CFURLCreateStringByteAddingPercentEscapes函数,下面我们对其进行封装,提供一个完善的url编码函数。NSString* encodeURL(NSString* u
阅读全文
摘要:今天使用AudioFileOpenWithCallbacks异步读取文件时,总是提示AudioFileOpenWithCallbacks第三个和第五个参数类型不对,也就是AudioFile_WriteProc和AudioFile_SetSizeProc两个异步函数,可是明明是按照文档定义的,奇怪的很。文档里这两个函数分别声明为typedef OSStatus (*AudioFile_WriteProc) ( void *inClientData, SInt64 inPosition, UInt32 requestCount, ...
阅读全文
摘要:在调试程序的过程中,有时候我们只是需要知道这个异常或者错误发生在源程序的哪个文件的哪一行,而不是为每一个可能的异常和错误都定义一个唯一的错误码,错误程序过度膨胀后,也会影响程序的可读性。这里,使用一个简单的宏printLineNumber,即可显示当前所在的行和源文件#define FILENAME NSString * fileName = [NSString stringWithUTF8String:__FILE__]#define printLineNumber FILENAME ;\printf("line %d in %s:",__LINE__,[[fileNam
阅读全文
摘要:这些对比主要基本本地媒体文件,在使用这两项技术的过程中笔者发现一个奇怪的问题,即分别使用这两种不同的技术获取媒体文件的容量时,得到的数据不同,一般来说时audio file stream得到的数据小于 audio file。而audio file得到的数据等于使用 nsfilemanager 技术得到的数据大小,因此可知使用audio file stream技术得到的数据大小有误,可能是因为其主要用来播放在线媒体的缘故,处理的环境更为复杂,导致不够准确。更有甚者,使用 audio file技术可以获得大小的本地文件,使用audio file stream 技术却无法获得大小。以下附上上文中提到
阅读全文
摘要:一直都有发现一个问题,即调用audioqueuestart成功后,立即调用audioqueuegetcurrenttime会返回失败,错误码为kAudioQueueErr_InvalidRunState。这就很奇怪了调用audioqueuegetprorperty函数返回kaudioqueue_isrunning为真,也就是这时audioqueue已经在运行了,而audioqueuegetcurrenttime的返回值却表示audioqueue并未运行,很是奇怪,只有调用一下CFRunLoopRunInMode函数之后,才可以获取audioqueue的运行时间。太奇怪了,百思不得其解。
阅读全文
摘要:最近一直在搞音频相关的项目,很羡慕与酷我听听瞬时的启动速度,而我自己的在线音频需要3-4s的启动时间,本地音频则需要1-2s的启动时间。有一些强迫症的笔者希望能够大大提升audioqueue的启动速度,开始以为是本地文件的加载速度不行,因为一开始使用的是cfreadstream技术,是一种异步文件读取技术,所以初步假定问题在这。接下来使用了CFReadStreamCreateWithBytesNoCopy技术和NSTimer技术,但是并无明显的速度提升。后来经过多次的定位,发现audioqueuestart函数的启动就需要花费1-2s(这次数字都是在本人电脑上测出的,不具有普遍性),当下觉得很
阅读全文
摘要:通过UIPageControl和UIScrollView的结合实现滑动翻页的效果时默认显示的时第一个view,而大多数时候我们可能需要将第二个或者第三个view作为默认页显示,而这时仅仅设置currentPage是不够的,它只能改变页面指示器的颜色,并不会完全达到我们需要的效果。其实很简单,仅仅通过更改scrollView的contentOffset即可平滑完美实现改变默认页面的功能,代码如下:CGPoint defaultPoint = ScrollView.contentOffset;defaultPoint.x += ScrollView.frame.size.width * i;Sc.
阅读全文
摘要:有时候在做界面设计的时候可能界面会比较复杂,完全使用代码实现可能比较麻烦,而单单地使用interface builder 则需要定义一个新的UIViewController,而我们仅仅需要一个view,这样未免有些小题大做。因此,这里介绍一种代码和interface builder相结合的方法,不用引入新的UIViewController。1. 首先使用interface builder 新建一个uiview的.xib文件。2. 向新建的uiview的.xib文件添加需要的控件。3. 定义一个继承自uiview的派生类。将上面新建的xib文件的派生类改为新定义的继承自uiview的派生类。4.
阅读全文