查看文章 |
iPhone 应用开发 - 八卦之[1]
2008/07/19 16:24
接着分析应用程序. 细看各个文件:main.m ,HelloWorldAppDelegate.m,HelloWorldAppDelegate.h还有NIB文件MainWindow.xib. 首先是main.m(.m文件类似于C的.c和C++的.cpp文件): Object-C代码, 代码高亮@代码发芽网 01 #import <UIKit/UIKit.h> 02 03 int main(int argc, char *argv[]) { 04 05 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 06 NSLog(@"hello!"); 07 int retVal = UIApplicationMain(argc, argv, nil, nil); 08 [pool release]; 09 return retVal; 10 } (OT一下,给代码发芽网做个广告:python写的,非常帅的,非常方便的,web2.0的代码高亮网站,刚想把这段代码贴上来,才发现emacs的htmlize插件还没装,突然想起来这个在python-cn邮件列表中看到过的网站,还真是不错!挺方便的,赶紧注册一个吧!不注册也能用) * #import 是更好的#include,不会多次加载同一个文件 * main函数颇像C系列的main函数(就是一样!) * NS打头的是nextstep的缩写 * NSAutoreleasePool 这个东西目前只知道是用来完成GC的,具体是如何做到的不太清楚 * NSLog是我加的一行,用来输出变量,可以在"Console"窗口看到输出的内容(点那个画着"gdb"三个字母的图标);其他的变量值可以在"Show Debugger"里面看到(gdb左边那个按钮) * @的用法,还没忘,是用于吧string转成NSString,必须这样输出字符串. * UIApplicationMain没什么好说的 * [pool release]翻译成C++就是: pool.release(); main.m比较好理解,还有个UIApplicationMain一会儿再说. 另外,关于YES和NO, 在Objective-C语言中,真和假分别以1和0代替。它们属于一个特殊的数值类型——布尔型数值 (BOOL)。“真”可以用1或者YES代替;“假”可以用0或者“NO”代替另外, Object-C代码: iPhone HelloWorld 之HelloWorldAppDelegate.h 01 #import <UIKit/UIKit.h> 02 03 @class HelloWorldViewController; 04 05 @interface HelloWorldAppDelegate : NSObject <UIApplicationDelegate> { 06 IBOutlet UIWindow *window; 07 } 08 09 @property (nonatomic, retain) UIWindow *window; 10 11 @end * NSObject:NeXTStep Object 的缩写,现已改名为OpenStep,所以这个NS已经没什么意义了. * 继承(inheritance) ,以class:parent的形式表示,就像上面的(inheritance)以 Class: Parent 表示,就像上面的HelloWorldAppDelegate : NSObject * 成员方法的格式: scope (returnType) methodName: (parameter1Type) parameter1Name; scope 分为class和instance两种,instance methods以'-'开头;class methods以'+'开头,如果不明白什么是class methods 什么是instance methods 请自行google之. * {}之间的只是定义 instance variables而不是像C++那样整个类都放在里面,接口的结束(interface的结束)是在@end处,@end标示一个类(class)或者一个接口(interface)的结束. 本例中的instance variables 只有一个 IBOutlet UIWindow *window; 没有instance method或者class method * HelloWorldViewController 是声明的一个类. * @property在Objective-C中指示了变量的声明.括号中的retain指示了赋值器需要保留input值;这一行的其他部分指示了属性的类型和名称.以前的@property是直接这样:@property(xxxx)现在改为@property(nonatomic, xxxx)因为很多属性变量不需要支持多线程,用nonatomic比较节省资源. ------------------------------------NOTICE------------------------------------ 另外,当然有个另外!哈哈,这个property据说是Objective-C 2.0中引入的,"通常就是Java中的JavaBean,只是定义一个类变量(Class Virable)然后编译器和Runtime会自动为这个变量引入setter和getter的方法。其中有一些变化,包括可以设定是否只读,是否Copy原值等等,比较方便。" 有了这个就可以部分使用Dot操作符了,减少一些中括号操作,有个例子: """ 比如定义个Property如下: @property (nonatomic, retain) NSString * myStr; 接下来,你就可以在你的对象中使用dot操作符: myObj.myStr = @"TOTO"; 上面的表述还可以用以前的方括号来表示如下: [myObj setMyStr:@"TOTO"]; 在单个对象的情况下,还不是那么丑陋,在2层以上的对象嵌套使用以后就会非常的丑陋: [[[myObj prop1] prop2] setProp3:@"abc"]; 嘿嘿,真难看。不过这样的用法不太推荐罢了,如果有一个对象为NULL(Apple非要称之为Nil),就会抛出RuntimeException. 另外Apple还提供了一种在未定义Property的情况下,只要实现了相应的getter和setter方法,也可以使用Dot操作符的设定。 """ 如果你了解Python,Python里面的property可能跟这个property更为相像,除了上面提到的有点,property还有一点好处: "Properties perform tasks similar to those of special methods __getattr__ ,_settattr__,and __delattr__,but in a faster and simpler way"如果你不了解Python的Property也没关系,只要记着faster and simpler就ok了. ------------------------------------NOTICE END------------------------------------ 最后: Object-C代码: HelloWorldAppDelegate.m 01 #import "HelloWorldAppDelegate.h" 02 03 @implementation HelloWorldAppDelegate 04 05 @synthesize window; 06 07 - (void)applicationDidFinishLaunching:(UIApplication *)application { 08 09 // Override point for customization after app launch 10 [window makeKeyAndVisible]; 11 } 12 13 14 - (void)dealloc { 15 [window release]; 16 [super dealloc]; 17 } 18 19 20 @end * @implementation Implementation 用于实现class中定义好的methods,以@Implementation ClassName开始,以@end结束,跟interface中声明时很相似. * @synthesize @synthesize让编译器为我们自动生成赋值器和取值器,这样,我们只需为这个类实现dealloc方法.访问器只会在他们不存在的情况下才被生成,所以请放心的对一个属性使用@synthesize,然后在你需要的时候实现自定义的取值器和赋值器.编译器会填补任何方法的空白 至于MainWindow.xib.文件,还有nib文件属于资源文件,以后再研究. ok,这段文字里面好象没有八卦,下次补上吧! |
最近读者: