------Java培训、Android培训、iOS培训、.Net培训 期待与您交流! -------
本篇讲述了OC的基本语法以及类的使用。
基本语法篇
1.oc小知识
OC可以同时编写c语言和oc的东西,后缀名是.m,
还可以编写c++的东西,但是要把后缀名改成.mm。
大部分关键字以@开头
nil = c中的null(0)
输出使用NSLog(@"hello")( 输出一句 话之后会自 动换行,所以不用 '\n'了 ),使用NSLog需要import Foundation框架的主头文件Foundation.h
#import <Foundation/Foundation.h>
int main()
{
NSLog(@"第一个OC小程序");
return 0;
}
import用途
与include一样,拷贝文件内容, 可以自动防止文件的内容被重复拷贝(相当于上一篇中所讲的条件编译在头文件里的作用)
localhost:OC liweixi$ cc 01-第一个OC程序.m -framework Foundation
localhost:OC liweixi$ ./a.out
2015-04-15 10:53:30.814 a.out[2367:507] 第一个OC小程序
oc的开发过程
oc的程序在编译上与c语言的一样,但是在链接的时候有所不同
c语言的链接是将所有的.o目标文件和c语言的函数库链接生成一个可执行文件
oc的链接编译时不会将oc的函数库链接进来,所以编译时需要把框架加上
2.BOOL型
BOOL类型的本质:typedef signed char BOOL;
BOOL类型的变量有2种取值:YES、NO
#define YES (BOOL)1
#define NO (BOOL)0
BOOL的输出(当做整数来用)
NSLog(@"%d %d", YES, NO);
3. 多文件开发
#import "two.h"
int main()
{
test();
return 0;
}
two.c
#include<stdio.h>
void test()
{
printf("这里调用了.c文件\n");
}
two.h
#ifndef TWO_H
#define TWO_H
void test();
#endif
编译及运行
localhost:多文件混用 liweixi$ cc one.m two.c
localhost:多文件混用 liweixi$ ./a.out
这里调用了.c文件
localhost:多文件混用 liweixi$
4. 常用术语
面向对象 Object Oriented 简称OO
面向对象编程 Object Oriented Programming 简称OOP
类--基础篇
1. 类的设计与实现
属性
行为(功能)
完整的写一个类,必须有声明和实现 (实际上只有实现没有声明,程序也是可以运行的,但是最好还是声明和实现都要有)
#import<Foundation/Foundation.h>
@interface Car:NSObject
{
@public
int wheels;
float speed;
}
- (void) run;
@end
@implementation Car
- (void) run
{
NSLog(@"车子跑起来,时速%f",speed);
}
@end
int main()
{
Car *p = [Car new];
p->wheels = 4;
NSLog(@"车子的轮子数:%d",p->wheels);
p->speed = 200;
[p run];
return 0;
}
localhost:类相关 liweixi$ cc 03-第一个oc类的练习.m -framework Foundation
localhost:类相关 liweixi$ ./a.out
2015-04-15 11:36:01.514 a.out[2531:507] 车子的轮子数:4
2015-04-15 11:36:01.516 a.out[2531:507] 车子跑起来,时速200.000000
localhost:类相关 liweixi$
@public是为了能从外部访问成员变量,但是这种方法其实不推荐,面向对象的思想就是将类中所有的方法和成员变量封装,要使用成员变量只能通过方法来调用,而不能让外部知道其内部的设计,关于这点的解决方法将放到下面的set方法和get方法中来说明。
2. OC编程的注意点
oc中的对象是不可能自动回收的(这个涉及到内存管理的相关知识,后面会有专门的介绍)
oc编程时的一些常见错误
(1)interface定义和implementation不可以嵌套
(2)方法的声明一定要在interface内,不可以在implementation中进行方法的声明,方法不能用static修饰
(3)interface声明的时候,不允许给成员变量赋值,不能随便将成员变量当做C语言中的变量,不能用static修饰
3. 类的合理设计
#import<Foundation/Foundation.h>
typedef struct{
int year;
int month;
int day;
}Date;
typedef enum{
ColorBlue,
ColorBlack,
ColorWhite,
}Color;
//定义一个性别的枚举类型
typedef enum
{
Sex_man,
Sex_woman,
}Sex;
@interface Dog:NSObject
{
@public
double _weight;
Color furColor;
}
-(void) eat;
-(void) run;
@end
@implementation Dog
- (void) eat
{
_weight+=1;
NSLog(@"狗吃完这次之后的体重是%f",_weight);
}
- (void) run
{
_weight -= 1;
NSLog(@"狗跑完这次之后的体重是%f",_weight);
}
@end
@interface Student:NSObject
{
@public
Sex sex;
Date birthday;
double weight;
Color favColor;
char *name;
Dog *_dog;
}
- (void) eat;
- (void) run;
- (void) print;
- (void) liugou;
- (void) weigou;
@end
@implementation Student
- (void) eat
{
weight+=1;
NSLog(@"吃完这次之后的体重是%f",weight);
}
- (void) run
{
weight -= 1;
NSLog(@"跑完这次之后的体重是%f",weight);
}
- (void) print
{
NSLog(@"性别=%d,喜欢的颜色=%d,姓名=%s,生日=%d-%d-%d",sex,favColor,name,birthday.year,birthday.month,birthday.day);
}
- (void) liugou
{
[_dog run];
NSLog(@"test%f",_dog->_weight);
}
- (void) weigou
{
[_dog eat];
}
@end
int main()
{
Student *s = [Student new];
s -> weight = 50;
s -> sex = Sex_man;
s->birthday.year = 2011;
s->birthday.month = 9;
s->birthday.day = 10;
s->favColor = ColorBlack;
s->name = "OC-Program";
[s eat];
[s eat];
[s run];
[s run];
[s print];
Dog *d = [Dog new];
d -> _weight = 25;
d -> _furColor = ColorBlack;
s->dog = d;
[s liugou];
[s weigou];
return 0;
}
运行结果
localhost:类相关 liweixi$ cc 07-类的合理设计.m -framework Foundation
localhost:类相关 liweixi$ ./a.out
2015-04-15 12:12:55.721 a.out[2642:507] 吃完这次之后的体重是51.000000
2015-04-15 12:12:55.722 a.out[2642:507] 吃完这次之后的体重是52.000000
2015-04-15 12:12:55.723 a.out[2642:507] 跑完这次之后的体重是51.000000
2015-04-15 12:12:55.723 a.out[2642:507] 跑完这次之后的体重是50.000000
2015-04-15 12:12:55.723 a.out[2642:507] 性别=0,喜欢的颜色=1,姓名=OC-Program,生日=2011-9-10
2015-04-15 12:12:55.724 a.out[2642:507] 狗跑完这次之后的体重是24.000000
2015-04-15 12:12:55.724 a.out[2642:507] test24.000000
2015-04-15 12:12:55.724 a.out[2642:507] 狗吃完这次之后的体重是25.000000
这段代码中有两个类:Student和Dog,他们之间的关系是Student拥有Dog,是组合关系