• 程序中读取可用内存

    iPhone/iPad的内存十分紧张,所以有时进行调试时可能需要读取当前可用内存。其实挺简单,见下列代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #import <mach/mach.h>
    #import <mach/mach_host.h>

    @implementation Utils

    + (double)getAvailableMemory
    {
        vm_statistics_data_t vmStats;
        mach_msg_type_number_t infoCount = HOST_VM_INFO_COUNT;
        kern_return_t kernReturn = host_statistics(mach_host_self(), HOST_VM_INFO, (host_info_t)&vmStats, &infoCount);
       
        if (kernReturn != KERN_SUCCESS)
        {
            return NSNotFound;
        }
       
        return (vm_page_size * vmStats.free_count);
    }

    end

    使用方法更简单,比如:

    1
    NSLog(@"Available memory (KB) =  %f",[Utils getAvailableMemory]);
     
  • IAP transaction error

    这几天测试IAP时,总是出现下列错误:

    You’ve already purchased this but it hasn’t been downloaded…..

    然后就是,Transaction Failed,错误原因是:无法连接iTune Store。上网查了一下很多人说是iTunes Store的问题,等几天就好了,但我用另一个iDP的账户又没有问题。进过调试,最后发现问题出在iTune Store 的 test account上,原来我没有为新iDP账户创建test account,这原来是个低级错误,不过Apple的错误信息也太容易误导人了吧?

     
  • 怎样让Mac终端变彩色

    这个话题与iPhone无关,不过我今天心血来潮突然想为终端加点颜色.

    很简单,使用编辑器,比如vi打开~/.bash_profile,加入:

    export CLICOLOR=1
    export LSCOLORS=ExFxCxDxBxegedabagacad

    但这些设置是什么意思呢?下面是解释:

    首先LSCOLORS是十一对字母表示前景和背景颜色,按顺序是:

    directory
    symbolic link
    socket
    pipe
    executable
    block special
    character special
    executable with setuid bit set
    executable with setgid bit set
    directory writable to others, with sticky bit
    directory writable to others, without sticky bit

    字母代表的颜色:

    a black
    b red
    c green
    d brown
    e blue
    f magenta
    c cyan
    h light grey
    A block black, usually shows up as dark grey
    B bold red
    C bold green
    D bold brown, usually shows up as yellow
    E bold blue
    F bold magenta
    G bold cyan
    H bold light grey; looks like bright white
    x default foreground or background

    大家尽可以改成自己喜欢的颜色.

     
  • 怎样减小png图像文件的尺寸

    有两种方法:

    1. 直接使用preview打开png文件,然后选择”另存为”,覆盖原文件.
    2. 使用pngcrush开源软件,这种方法能使png文件更小,但由于pngcrush仅提供源代码需要自己编译.不过这也不是什么问题.

    编译pngcrush的步骤:

    1. 下载pngcrush
    2. 解压
    3. 编译.非常简单,使用
    4. make

    5. 进行编译
    6. 复制到用户bin目录下
    7. sudo mv pngcrush /usr/local/bin/

    使用pngcrush也非常简单,例如:

    pngcrush -reduce -brute -d output image.png image.png

    就是将图像文件image.png减小尺寸,输出到output目录下.非常遗憾,pngcrsh并不支持目录操作.不过反正有源代码,自己改一下也不是什么大问题吧?

     
  • 怎样处理EXC_BAD_ACCESS

    相信很多人都知道通过NSZombies来帮助调试出现EXC_BAD_ACCESS的情况,但有时还是找不到需要的信息,那么应该怎么办呢?

    下面通过一个例子来说明.下面是hello world的代码:

    1
    2
    3
    NSString* hello = [NSString stringWithFormat:@"Hello world"];
    NSLog(@"What you say is %@",hello);
    [hello release];

    运行后出现EXC_BAD_ACCESS错误.但没有其他任何提示,这时候通过右击executables下的应用程序名,选择get info后,在arguments下输入环境变量(NSZombieEnabled,MallocStackLogging),如图所示:

    add_zombie

    再次运行后程序crash,如图:
    crash

    这次可以看到问题是”message sent to dealloced object”了,但具体是哪个语句引起的还并不知道,于是需要在gdb上输入以下语句:

    shell malloc_history pid address

    那么pid和address是什么呢?再看下crash的图片结合一下我以下使用的命令,你应该很快就可以判定pid和address是从哪里来的了,我的命令是:

    shell malloc_history 596 0×5f3ef80

    再次运行,程序crash时会出现大量的stack trace信息,如下图是与本程序相关的:
    malloc_history

    根据这些信息大家就可以找到问题出现在[BadAccessViewController viewDidLoad] 中与 +[NSString stringWithFormat:] 有关的地方.

    最后大家记得把环境变量NSZombieEnabled,MallocStackLogging删除或设置为NO,因为它们会使得内存不会被释放.

     
  • 怎样使UISearchBar背景透明

    在使用UISearchBar时,将背景色设定为clearColor,或者将translucent设为YES,都不能使背景透明,经过一番研究,发现了一种超级简单和实用的方法:

    1
    [[searchbar.subviews objectAtIndex:0]removeFromSuperview];

    背景完全消除了,只剩下搜索框本身了。

     
  • Xcode不支持iPhoe OS 3.2.1的解决方法

    最近iPad升级到iPhone 3.2.1,今天准备进行真机调试,猛然发现Xcode下出现下列错误:


    The version of iPhone OS on “xxxx” does not match any of the versions of iPhone OS supported for development with this copy of Xcode. Please restore the device to a version of the OS listed below. If necessary, the latest version of Xcode is available here.


    Google 了一下,发现是3.2.1的目录在DeviceSupport下不存在。解决办法是用最接近的OS版本使用ln命令进行链接。不过在操作过程中有两个问题:


    1. 不知什么原因,ln -s 命令后总是为文件而不是目录
    2. 不知OS 3.2的build number


    于是,采用最笨但最为有效的方法:


    在/Developer/Platforms/iPhoneOS.platform/DeviceSupport目录下创建3.2.1目录,然后,将3.2下所有文件及目录复制到3.2.1下,重新启动Xcode,问题解决。

     
  • Open source CoverFlow

    使用OpenGL ES的开源Cover Flow,据说有好几个上架程序中都有使用,见http://www.chaosinmotion.com/flowcover.m

     
  • 修改公司名称的“新”方法

    以前发过一篇文章介绍怎样修改Xcode中的公司名称,见怎样替换Xcode中__MyCompanyName__

    现在(不知是从Xcode哪个版本开始,我是3.2.3)可以有更简单的方法修改公司名称,而且还可以在基于项目修改。方法如下:

    1. 右击项目名称,选择“Get Info…”
    2. 在“General Settings”一栏中可以看到“Organization Name”,修改它,那么本项目中的公司名称就修改了。

     
  • 怎样离线使用iPhone SDK文档

    我是用Dell机安装的雪豹系统,由于没有无线网卡的支持,所以上网很不方便。在使用Xcode进行iPhone编程时,有时需要参考iPhone SDK的文档,不过每次Control+Click后,Xcode都会试图连接Internet,进行在线读取。有什么方法能够把资料下载到硬盘上进行离线阅读吗?


    答案是肯定的。首先去Xcode的Preference中的Documentation Sets下,选择所需的docset,这里是iPhone 4.0 Reference Library,右击选择“Get Info…”,找到Feed URL:


    http://developer.apple.com/rss/com.apple.adc.documentation.AppleiPhone4_0.atom


    用浏览器打开,下面列出了许多版本,在Windows下你就可以使用迅雷下载了。


    下载后,拷贝到Mac的/Developer/Documentations/Docset目录下,使用终端命令:

    sudo xar -xf 下载的文件名.xar



    将其解压,然后使用:

    sudo chown -R -P devdocs 解压后的文件名.docset



    将文档的所有者改为devdocs。打开Xcode就可以离线浏览了。