• 怎样减小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就可以离线浏览了。

     
  • Navigation-Based应用程序iPad模板

    准备为iPad写一个Navigation-Based程序,却发现XCode 3.2中根本没有iPad的Navigation-Based程序的模板。Apple推荐在iPad下使用Split-View程序,但我并不想这样做,原因是我的iPad程序以后可能要放到iPhone中去,所以我需要一个Universal版。如果我在iPad下使用Split-View,那么这两个版本相差太大,所以我觉得都使用Navigation-Based程序。


    试了半天想修改iPhone的Navigation-Based程序的模板到iPad下,却没有成功,在网上搜了一下,终于找到一个别人做好的。下面是下载地址。可以使用如下命令将其加到XCode的模板中:

    mkdir -p “$HOME/Library/Application Support/Developer/Shared/XCode/Project Templates/My Templates”

    cd “$HOME/Library/Application Support/Developer/Shared/XCode/Project Templates/My Templates”

    git clone git://github.com/benellingson/Universal-Navigation-based-Application.git

    rm -rf “Universal-Navigation-based-Application/.git”



    或者下载zip文件,在创建了目录后,将zip解压其下。

     
  • 访问外部网页

    实际上有两种方法,第一种是:

    1
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://www.google.com"]];



    这种方法将会退出当前程序,用Safari打开url。我有好几个朋友都问到这个问题,实际上非常简单,可以使用UIWebView在当前程序中打开网页(假定你的UIWebView实例为webView):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
         NSString *urlAddress = @"http://localhost";
           
        //Create a URL object.
        NSURL *url = [NSURL URLWithString:urlAddress];
           
        //URL Requst Object
        NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
           
        //Load the request in the UIWebView.
        [webView loadRequest:requestObj];
     
  • 都是Backgrounder惹的祸 – 解决“越狱”真机调试的问题

    我的iPhone越狱后,在用Xcode进行调试时出现以下错误信息:


    warning: Unable to read symbols for “/Library/MobileSubstrate/DynamicLibraryies/libstatusbar.dylib” (file not found).

    Program received singal: “SIGUSR1″.


    上网查了一下原来是Backgrounder在作怪,最简单的解决方法就是在Backgournder的overrides设定中,禁止要调试的程序以background模式运行即可。


    想要知道具体原因,请参见:Backgrounder vs. Build and Run