2014-10-19 wcdj
摘要:本文介绍关于Objective-C的一些基础知识,使用的环境是OS X 10.9.5,Xcode 5.1.1版本。
0 创建Hello Objective-C程序
(1) 打开Xcode,选择Create a new Xcode project -> Application -> Command Line Tool,在Type选择Foundation,然后完成。
(2) 修改样本代码。
//
// main.m
// Hello Objective-C
//
// Created by gerryyang on 14-10-19.
// Copyright (c) 2014年 gerryyang. All rights reserved.
//
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
NSLog(@"Hello Objective-C, wcdj!");
return 0;
}
(3) 编译运行代码。
可以使用快捷键Command + R,效果如下:
(4) 显示控制台的方法
方法一:View -> Debug Area -> Activate Console
方法二:Command + Shift + C
1 代码解析
(1) Xcode通过.m扩展名来表示文件使用的是Objective-C代码,应由Objective-C编译器处理。而C编译器处理.c文件,C++编译器处理.cpp文件。在Xcode中,所有这些编译工作默认由LLVM处理。这个编译器能够理解C语言的全部3个变体。
(2) #import语句与#include语句的区别。与C语言一样,Objective-C使用头文件来包含结构体、符号常量和函数原型等元素的声明。#import是由Xcode使用的编译器提供的,Xcode在你编译Objective-C、C和C++程序时都会使用它。#import可以保证头文件只被包含一次,无论此命令在该文件中出现了多少次。对比C语言,需要使用头文件卫士来保证这个工作。
(3) 框架。是一种把头文件、库、图片、声音等内容聚集在一个独立单元中的集合体。苹果将Cocoa、Carbon、QuickTime和OpenGL等技术作为框架集来提供。Cocoa的组成部分有Foundation和Application Kit框架,此外还有一套支持型框架。Foundation框架处理的是用户界面之下的那些Layer的特性,比如数据机构和通信机制。
(4) 框架和头文件的关系。每个框架都是一个重要的技术集合,通常包含数十个甚至上百个头文件。每个框架都有一个主头文件,它包含了框架内所有的头文件,通过#import主头文件,就可以访问框架内的所有功能。
(5) 读这么多头文件是否会很慢?Foundation框架的头文件占用了近1MB的磁盘空间,包含了14000多行代码,涵盖了100多个文件,只要使用#import <Foundation/Foundation.h>来包含主头文件,就能获得整个集合。也许你担心读取每个文件的文本会消耗编辑器很多时间,但是Xcode非常聪明,它使用预编译头文件来加快读取速度(一种经过压缩的、摘要形式的头文件)。
(6) NSLog和printf的区别。
你可以使用printf()来代替NSLog()函数,但是建议还是使用NSLog()函数,因为它添加了一些特性,比如时间戳、日期戳和自动附加换行符等。
(7) 避免命名冲突的NS前缀。
(a) 事实上,Cocoa给其所有函数、常量和类型名称都添加了NS前缀。例如,NSLog()函数的NS前缀表明此函数来自Cocoa而不是其他的工具包。
(b) 为什么使用NS前缀?使用前缀能避免名称冲突。由于没有集中管理的前缀注册表,所以可以任意选择前缀。许多人使用他们的姓名首字母或公司名称作为前缀。
(c) NS前缀的由来。知道前缀的好处后,但可能还是会奇怪,为何前缀是NS而不是Cocoa。NS前缀的来历要追溯至此工具包还被称为NextSTEP的时候,当时它使NeXT Software公司的产品,苹果公司后来收购了此公司后,没有破坏为NextSTEP编写代码的兼容性,继续使用NS前缀。由此可见,NS就像我的阑尾一样,都属于历史遗存。
(8) NSString的用法。
@是本体。@符号是Objective-C在标准C语言基础上添加的特性之一。@符号意味着引号内的字符串应作为Cocoa的NSString元素来处理。
一个比较容易犯的错误是将C语言风格的字符串传递给NSLog()函数,这样将得到如下编译错误:
2 使用BOOL的例子
//
// main.m
// Hello Objective-C
//
// Created by gerryyang on 14-10-19.
// Copyright (c) 2014年 gerryyang. All rights reserved.
//
#import <Foundation/Foundation.h>
BOOL areIntsDifferent (int thing1, int thing2)
{
if (thing1 == thing2) {
return NO;
} else {
return YES;
}
}
NSString *boolString(BOOL yesNo)
{
if (yesNo == NO) {
return @"NO";
} else {
return @"YES";
}
}
int main(int argc, const char * argv[])
{
BOOL areTheyDifferent;
areTheyDifferent = areIntsDifferent(5, 5);
NSLog(@"are %d and %d different? %@", 5, 5, boolString(areTheyDifferent));
areTheyDifferent = areIntsDifferent(23, 42);
NSLog(@"are %d and %d different? %@", 23, 42, boolString(areTheyDifferent));
return 0;
}
/*
output:
2014-10-19 20:44:09.103 Hello Objective-C[20984:303] are 5 and 5 different? NO
2014-10-19 20:44:09.105 Hello Objective-C[20984:303] are 23 and 42 different? YES
Program ended with exit code: 0
*/
参考
[1] Learn Objective-C on the Mac For OS X and iOS (2nd Edition)