一、基本概念
Objective-C(简称OC)是iOS开发的核心语言,苹果公司在维护,在开发过程中也会配合着使用C语言、C++,OC主要负责UI界面,C语言、C++可用于图形处理。C语言是面向过程的语言,OC是在C语言基础上加上了一层面向对象的语法(将复杂面向对象语法去掉了)。我们可以使用OC开发Mac OS X平台和IOS平台的应用程序。
2014年10月编程语言排行榜(http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html)

从这个排行榜上可以看到,高居榜首的还是c、java、object-c、c++、c#、php、python、javascript.
注意:
1、Objective-C是没有包的概念的,也就是没有命名空间机制,而是通过给类名添加前缀来防止类名冲突。
2、Objective-C中的关键字以@开头,防止和c/c++的关键字冲突。
3、Objective-C中的字符串以@开头。
语法:

需要注意的是上面的红色字部分:
BOOL类型(YES\NO)其实就是1和0
nil相当于Java中的null
self相当于Java中的this
for(xx in xx)和javascript的快速遍历相同,相当于java中的for...each
继承和Java相同是单继承
二、第一个OC程序

选择命令行程序

选择语言位Objective-C,创建好的工程如下:

1// 2// main.m 3// firstOCProj 4// 5// Created by lixiaoqiang on 14/11/11. 6// Copyright (c) 2014年 lixiaoqiang. All rights reserved. 7// 8 9#import <Foundation/Foundation.h> 10 11int main(int argc, const char * argv[]) { 12 @autoreleasepool { 13 // insert code here... 14 NSLog(@"Hello, World!"); 15 } 16 return 0; 17}
控制台输出:
2014-11-11 23:44:36.052 firstOCProj[1649:99047] Hello, World!
上面的@autoreleasepool和内存管理有关,暂时不用管。
#import <Foundation/Foundation.h> : import和include的作用一样,唯一区别是可以防止头文件被重复包含。
NSLog():向控制台输出日志,相当于c语言中的printf(),和android中的Log
三、类的基本语法
OC中的类分为两个文件,一个是.h文件,另一个是.m文件(是OC文件的后缀名)
.h : 类的声明文件,用于声明成员变量和方法。
.m : 实现.h中声明的方法。
新建Student.h和Student.m文件,工程如下:

Student.h文件
1// 2// Student.h 3// firstOCProj 4// 5// Created by lixiaoqiang on 14/11/11. 6// Copyright (c) 2014年 lixiaoqiang. All rights reserved. 7// 8//该文件只是用来声明Student这个类有哪些成员变量和方法 9 10//包含NSObject所在的头文件 11#import <Foundation/Foundation.h> 12//@interface @end代表声明一个类 13//和Java不同的是OC中不能省略NSObject的默认继承 14// : 代表继承 15@interface Student : NSObject{ 16 //定义成员变量(必须定义在该括号内) 17 int age; 18} 19 20//age的get方法 21//如果是动态方法 - 22//如果是静态方法 + (-和+必须添加) 23//OC中的参数类型都用括号括住 24//.h文件中的方法都是公共方法 25- (int)age; 26 27//age的set方法 28//OC中一个 : 对应一个参数 29- (void)setAge:(int)newAge; 30@end
Student.m文件
1// 2// Student.m 3// firstOCProj 4// 5// Created by lixiaoqiang on 14/11/11. 6// Copyright (c) 2014年 lixiaoqiang. All rights reserved. 7// 8//自定义的头文件使用双引号 9#import "Student.h" 10 11@implementation Student 12 13- (int)getAge { 14 return age; //age在父类中 15} 16 17- (void)setAge:(int)newAge { 18 age = newAge; 19} 20 21@end
main.m文件
1// 2// main.m 3// firstOCProj 4// 5// Created by lixiaoqiang on 14/11/11. 6// Copyright (c) 2014年 lixiaoqiang. All rights reserved. 7// 8 9#import <Foundation/Foundation.h> 10#import "Student.h" 11 12int main(int argc, const char * argv[]) { 13 @autoreleasepool { 14 15 //创建一个Student对象 16 //1、调用一个静态方法alloc分配内存 17 //OC 中通过类名调用方法 [类名 方法名] 18 //[Student alloc]返回一个指针,在OC中stu称为对象 19 //这个其实和Java中的对象(this)是一样的(引用) 20 //Student *stu = [Student alloc]; 21 //2、调用一个动态方法init进行初始化 22 //stu = [stu init]; 23 24 //连接起来使用 25 Student *stu = [[Student alloc] init]; 26 [stu setAge:100]; 27 NSLog(@"调用了setAge方法"); 28 int age = [stu age]; 29 NSLog(@"Student的age是%i", age); 30 //释放对象 31 //[stu release]; 32 } 33 return 0; 34}
运行结果:
2014-11-12 00:25:03.661 firstOCProj[1707:110472] 调用了setAge方法
2014-11-12 00:25:03.663 firstOCProj[1707:110472] Student的age是100
四、点语法
1#import <Foundation/Foundation.h> 2 3@interface Person : NSObject{ 4 int _age; 5 int _no; 6} 7 8- (void)setAge:(int)newAge; 9- (int)age; 10 11//注意: 方法名是setAge:andNo: 12- (void)setAge:(int)newAge AndNo:(int)no; 13 14@end 15 16#import "Person.h" 17 18@implementation Person 19 20//方法名是setAge: (冒号也是方法名的一部分) 21- (void)setAge:(int)newAge { 22 NSLog(@"调用了setAge方法:%i", newAge); 23 _age = newAge; 24} 25 26//方法名是age 27- (int)age { 28 NSLog(@"调用了age方法"); 29 return _age; 30} 31 32@end
在Person类的实现里面我们分别打印了两个log用来判断是否调用了该方法
1#import <Foundation/Foundation.h> 2#import "Person.h" 3 4int main(int argc, const char * argv[]) { 5 @autoreleasepool { 6 Person *person = [[Person alloc] init]; 7 8 //方法一: 9 //[person setAge:10]; 10 //int age = [person age]; 11 12 //方法二:(点语法) 13 //OC中调用的成员方法,等效于[person age] 14 person.age = 11; 15 //等效于[person setAge:11] 16 int age = person.age; 17 18 NSLog(@"age is %i", age); 19 } 20 return 0; 21}
输出结果:
2014-11-12 20:03:55.718 firstOCProj[521:19414] 调用了setAge方法:11
2014-11-12 20:03:55.719 firstOCProj[521:19414] 调用了age方法
2014-11-12 20:03:55.720 firstOCProj[521:19414] age is 11
可以看到在OC中的点语法和Java中是不一样的,person.age调用的是成员方法而不是变量。
五、构造方法和%@
1// 2// Person.m 3// firstOCProj 4// 5// Created by lixiaoqiang on 14/11/12. 6// Copyright (c) 2014年 lixiaoqiang. All rights reserved. 7// 8 9#import "Person.h" 10 11@implementation Person 12 13- (void)setAge:(int)age { 14 _age = age; 15} 16 17- (int)age { 18 return _age; 19} 20 21- (void)setNo:(int)no { 22 _no = no; 23} 24 25- (int)no { 26 return _no; 27} 28 29//实现构造方法 30 31- (id)initWithAge:(int)age andNo:(int)no { 32 //首先要调用super的构造方法 33 if(self = [super init]){ //如果self不为nil 34 self.age = age; 35 self.no = no; 36 } 37 return self; 38} 39 40// 重写父类的description方法 41// 当使用%@打印一个对象的时候会调用 42// NSString 是一个字符串类 43- (NSString *)description { 44 return [NSString stringWithFormat:@"age is %i and no is %i", _age, _no]; 45} 46 47@end 48 49// 50// main.m 51// firstOCProj 52// 53// Created by lixiaoqiang on 14/11/11. 54// Copyright (c) 2014年 lixiaoqiang. All rights reserved. 55// 56 57#import <Foundation/Foundation.h> 58#import "Person.h" 59 60int main(int argc, const char * argv[]) { 61 @autoreleasepool { 62 Person *person = [[Person alloc] initWithAge:15 andNo:2]; 63 64 NSLog(@"age is %i and no is %i", person.age, person.no); 65 66 //%@代表打印一个OC对象 67 NSLog(@"%@", person); 68 } 69 return 0; 70}