does not implement methodSignatureForSelector: -- trouble ahead

刚开始写 Objetive-C 程序,有时候写了一个类时,一调用实例或是类的方法就报错,错误内容大约如下:

2011-06-19 01:14:10.175 Hello World[26080:40b] *** NSInvocation: warning: object 0x4654 of class 'Car' does not implement methodSignatureForSelector: -- trouble ahead
2011-06-19 01:14:10.178 Hello World[26080:40b] *** NSInvocation: warning: object 0x4654 of class 'Car' does not implement doesNotRecognizeSelector: -- abort

调用代码,非常简单,就是:

Car* car = [[Car alloc]init];
[car foo];

看错误仿佛是找不到 foo 方法,可是仔细检查再检查,方法也是有的,也没有打错字。

后来找到原因了,是源自于 Java 代码写多了的缘故,忘记了让自己定义的 Objective-C 类继承自 NSObject,写成了: 阅读全文 >>

Xcode4 相较于 Xcode3 使用中一些体验

从 Xcode3 升级到 Xcode4 的一些使用体验:

1. 注释的时候更智能,按 Command + / 时不会像 Xcode3 里那样在光标处插入 //,而是会在行首加 //,并且多行注释时 // 很整齐了

2. 大括号有自动补齐的功能了,方法后输入左花括号 { 后,右边的花括号 } 由 Xcode 自动加上。

3. 智能提示中的内容丰富的多,方法的参数返回类型看得很清楚,尚不明最前面标识的 K、f、P、V、x、T、C、M、#等是什么意义,不过也差不多有些概念了。

4. @interface 的模板也不一样了,出现默认 @private 修饰关键字,这是对的,默认的实例变量应该是隐藏的,@interface 的模板是:

@interface <# class name #> : <# superclass #> { 阅读全文 >>

Obejctive-C 中定义可变参函数

Objective-C 中有许多不定参数函数,像 NSLog(format, arg1, arg2),还有字符串或数组在构造时所用的 [NSString stringWithFormat: format, arg1, arg2, arg3],它们的方法原型分别是:

FOUNDATION_EXPORT void NSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);
+ (id)stringWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);

应该去掉后面的 NS_FORMAT_FUNCTION(1,2) 来看,否来会干扰到思维。我们现在的例子还不需要这么写,至于 NS_FORMAT_FUNCTION(1,2) 的功用为何,我有时间还得好生看下。OK, 看多了 Apple 的那些可变参函数,可能反而令你感到费解,还不如来试个实际的例子:

阅读全文 >>

Objective-C 里指针变量星号 * 你会放在哪个位置

话说在 Objective-C 里声明指针变量时,星号(*) 该放到哪个位置,是紧贴变量类型,紧贴变量名还是放它们之间两边用空格,或者全挤在一起?到底还是在思考 C/C++ 中指针变量的声明风格,因为 Objective-C 是 C 的超集。

纯粹讲 Objective-C 的代码风格,我觉得 Google 的 Google Objective-C Style Guide 非常有指导意义。转回来看 Objective-C 声明指针变量时什么风格好些,下面四种都符合语法:

。看显然,第四种风格是最不好看的,就像有人写 SQL 喜欢 “select*from table1" 一样 阅读全文 >>

Xcode 4 常用快捷键(和 Xcode 3 有些不一样了)

把 Xcode 由 3.2.5 升级到 Xcode 4.0.2 之后,满以为快捷键总该不会变化太大吧,没想又要经历一个快捷键的适应过程,发现有些在 Xcode 3.2.5 中的快捷键到了 4 之后不灵光了。所以把之前的 http://yanbin.blog/xcode-3-shortcuts 标题也由原来的标题“XCode 中我的常用快捷键” 改为“XCode 3 中我的常用快捷键”,还在使用 Xcode 3 的可以回去看下,我想也是该丢弃 Xcode 3 的时候了。

主菜单调整的大,Build, Run 都没啦,快捷键的变动自然就大。再由于 Interface Builder 已经内建到 Xcode 中了,所以先前的 command + 数字 显示出相应面板的快捷键被替代为 command + option + 数字 了,但也不是直接对应的。连 option + command + up 在 .h 和 .m 间切换的快感的体验不到了,有触摸板的朋友请用三个手指上下划动来切换,对于 iMac 或黑苹果就不爽了。

对于 Xcode 4 的快捷键直接上两张图吧,其实这两种图是一样的,只是背景色不一样,白底的可以打印出来贴在照壁上,每天可以审视。

阅读全文 >>

Xcode 4 的新特性介绍

今天由 Xcode 3.2.5 升级到了 Xcode 4.0.2,Xcode 4.0.2 居然也要付费了,4.99 美刀,系统要求 Mac OS X 10.6.6 以上。安装之后发现有很大的不同,最让人意外的是居然连一些快捷键也变了,像 command + option + up 都没法在 .h 和 .m 文件间切换了,Interface Builder 就面目全非了。不过还好,反正使用 Xcode 3.2.5 的时间也不长,才三个星期左右,放心的忘了旧版本吧,努力去适应。苹果的风格是不想让人回头的,基本上一旦升级到新的版本上来,以后都不会有机会需要使用旧的版本的,何不让自己也 keep updated 呢?

关于 Xcode 4.0. 2 的新性可以直接看官方的介绍:What's New in Xcode 4Developer Tools Features。别看标题是 What's New in Xcode 4,好像讲的是 Xcode 4 的新特性,但这个链接并未受限于 4 这个版本,保管 Xcode 5 出来后同样是前面的链接内容却是 Xcode 5 的新特性了。

这里把别人翻译的 What's New in Xcode 4 转载到这里来,稍事整理。请对我们的开发工具更多些了解吧,用处呢,会很明显的。 阅读全文 >>

读《Objective-C培训资料》的摘要

本文为阅读文档:Objective-C 培训资料 的一些摘要,在此记录,以备回顾。

#define nil NULL
bool型与c/c++是一样的,非0为 TRUE/YES, 0 为 FALSE/NO, 用 if(flag==YES) 就要注意了,此时 YES 就是 1,不过你直接用 if(flag) ..... 来判断就只要不是 0 就成立。

#import 和 c/C++ 的 include 一样也有 <> 和 "" 两种查找方式。但是它不怕重复引入。

NSLog() 会自动在输出后加 \n,相当于 System.out.println().

Objective-C 的对象需要直接或间接的继承自 NSObject。Objective-C 的 @interface 相当 java 的 class,而 @protocol 才是 Java 的 interface。类声明的基本方式如下:

@interface <#class#> : <#superclass#>
{
   <#ivars#>
}

<#methods#>

@end 阅读全文 >>

XCode 3 中我的常用快捷键

适时的使用快捷键会提高工作的效率,可以让你的手尽量少的在键盘与鼠标间漂移,就像玩帝国与星际时不用快捷键一般会死得快一样,当然不乏一些特牛的人了。培养使用快捷键最好的办法是,当你需要用哪个菜单项,点击鼠标的同时请留言所提示的快捷键,下次尽量用快捷键来做同样的事情,培养习惯,甚至是肌肉记忆。记得 Eclipse 有那么一个插件,当你用鼠标操作了,如果有相应的快捷键,它会在显著的地方告诉你对应的快捷操作键。

下面是我日常中使用 概率比较高的 XCode 快捷键键。假如你用的是 PC 键盘的话,就要分清哪个是 Command 键,哪个是 Option。比如同一个 USB PC 键盘,我在 VirtualBox 中装的 Mac 系统,Alt 是 Command 键,Win 是 Option 键,VMWare 中的 Mac 系统则相反。

1.  esc                自动完成, 作用和VS中的ctrl+j类似,像 Eclipse 的 alt+/
      control + , 与上面相同的功能
2.  command + /                 注释代码和反注释,用 //,相当于 Eclipse 的 ctrl+/
3.  command + option + 上箭头  快速在头文件(.h)和实现文件(.m)之间切换
4.  command + b             编译程序,不运行
5.  command + return        编译并运行程序
6.  command + shift + b       打开编译结果窗口,显示编译详细信息

阅读全文 >>

Spring MVC 碰到 java.lang.NoSuchFieldError: APPLICATION_CONTEXT_ID_PREFIX

Spring MVC 应用在 Tomcat 启动的时候出现了下面的错误:

java.lang.NoSuchFieldError: APPLICATION_CONTEXT_ID_PREFIX
 at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:430)
 at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:458)
 at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:339)
 at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:306)
 at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:127)
 at javax.servlet.GenericServlet.init(GenericServlet.java:212)
 at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1173)
 at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:993)
 at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4350)
 at org.apache.catalina.core.StandardContext.start(StandardContext.java:4659)
 at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) 阅读全文 >>

推荐19个很有用的 JavaScript 库

流行的 JavaScript 库有jQuery,MooTools,Prototype,Dojo和YUI等,这些 JavaScript 库功能丰富,加上它们众多的插件,几乎能实现任何你需要的功能,然而需要实现一些特定的功能,则可以选择功能更专一的轻量库,今天这篇文章与大家分享16个很有用的 JavaScript 库。

Blackbird: Open Source JavaScript Logging Utility
Blackbird 是一款非常酷的 JavaScript 调试工具,带有一个漂亮的界面显示和过滤调试信息。
Javascript-199 in Useful JavaScript and jQuery Tools, Libraries, Plugins 阅读全文 >>