本人也是Objective-C的小白,以下只是记录我学习过程的历程,如有不对的地方或者疑问欢迎指正。
原发表在新浪微博上,现转移到这里
必备工具:
1.一本书,建议《Objective-C基础教程》,现在出到第二版了。
2.一个装有Mac OS操作系统的电脑,如果有能力当然是iMac或者Macbook,如果没有经济能力并且你相信你自己的windows电脑的配置够高,那么你可以在你的windows电脑上面装一个虚拟机,然后在虚拟机上运行Mac OS操作系统。
3.有了笔记本就需要Objective-C的开发工具——Xcode。
4.视频,网络上有很多OC基础教程视频,可以下下来看。
5.笔记本,笔,用来记录你认为不易懂的东西,方便以后查阅。
6.后期,唔,我还没到后期,目前为止只是为了IOS开发买了一本书,《精通IOS开发》,水果书系列的。
好啦,准备完毕。
开始啦!
Objective-C(以下简称OC)是一个面向对象的编程语言,OC的主要部分就是对象,创建对象首先需要创建一个对象所在的类。
所谓类和对象,就像是人类和个人的关系,任何一个人都属于人类的范畴,都是由DNA编码成的,都具有人类共有的属性,比如说耳朵、眼睛、鼻子、身高、体重、皮肤、细胞等等(太多了说不完),这里人类就相当于OC语言中的“类”,而任何一个人就相当于OC语言中类下的一个对象。
类是一个统称,类里面还包含了这些东西:
类的名字——就像“人类”一样,你需要一个名字与其他的类区分开。
类的属性——作为一个“人类”,是有着不同的属性的,上面说的耳朵眼睛神马的都属于属性的范围
类的实现——这里“实现”的定义是指类的实现的声明,就是告诉别人,作为“人类”大家都可以做的事情
而对象,则是从类的这些东西里面全部拿过来放在自己身上,就组成了一个属于这个类的对象。
OC语言中,创建类需要以下几个步骤:
1.类的声明
声明类的名字,继承
声明类具有的属性(成员变量)
声明类的实现(方法)
2.类的实现
编写类的实现(方法)的代码
3.类的调用
我用代码来说明:
#import
//这个和C语言有些类似,头文件声明,这里用 #import ,苹果官方建议使用 #import ,官方文档也是用的这个,用这个的好处是可以避免重复声明。
//Foundation,是OC下的一个开发框架,OC下的开发框架有很多,暂时我们只用到这一个。
//Foundation.h,是头文件,代表了可以调用Foundation框架下的所有内容。调用系统的 .h 文件是用尖括号 <> ,调用自己编写的 .h 文件使用双引号 "" 。
@interface 类名 : 父类名
//interface,是类的声明接口,后面接类名,再加冒号,冒号后面为继承的父类名,继承这里后面才会涉及,现在只知道,新的类,默认继承NSObject这个类,好用来实现类的方法的调用。
{
//声明类的属性(成员变量),类的属性(成员变量)的类型可以是任意类型,甚至可以是个类。类的属性(成员变量)声明职能放在interface下的大括号 {} 内。
属性类型 属性名称1;
属性类型 属性名称2;
属性类型 属性名称3;
......
}
//类的实现(方法)的声明,这里只声明,不写具体的语法。方法前面必有减号 - ,具体原因愿意了解可以参考《Objective-C基础教程》这本书。
- (返回值类型)方法名称:(参数类型)参数1 :(参数类型)参数2......;
- (返回值类型)方法名称:(参数类型)参数1 :(参数类型)参数2......;
......
@end
//@end是结束类的声明的标志符,必须有。
@implementation 类名
//implementation,是类的实现(方法),后面接前面已经声明过的类名。
- (返回值类型)方法名称:(参数类型)参数1 :(参数类型)参数2......
{
类的实现(方法)的代码;
}
- (返回值类型)方法名称:(参数类型)参数1 :(参数类型)参数2......
{
类的实现(方法)的代码;
}
......
@end
int main()
//主函数,和C语言一样
{
类名 *a = [类名 new];
//中括号 [] 是OC中特有的,[] 代表着方法的调用,所有方法的调用都必须放在中括号 [] 里面:[调用方法的对象 方法名称];
//new在这里是继承过NSObject类得来的方法,创建新对象的方法。
//[类名 new] 的意思就是以一个类为模版创建一个属于这个类的新对象。
//类名 *a 的意思是创建一个类的类型的指针,然后将后面新创建的这个类的对象的地址赋给这个指针。
a->属性名称 = 1;
//这个是利用指针对对象的属性进行初始化赋值,如果不进行赋值,所有属性值默认为0。
[a 方法名称];
//利用指针调用对象的方法。
return 0;
//返回0,释放内存。
}
下面是一个人的实例。
#import
typedef struct
{ //定义Date结构体。
int year;
int month;
int days;
}Date;
typedef enum
{ //定义Sex结构体。
SexMan,
SexWoman
}Sex;
@interface Car : NSObject//继承NSObject类。
{ //声明Car类的成员变量。
@public//@public 指的是允许外部指针调用对象的成员变量。
int far;//行驶距离(km)
}
- (void)run:(int)far1;//开车,int类型的参数far1 代表我想让车开出去多远。
@end
@interface Person : NSObject
{ //声明Person类的成员变量。
@public
char *name;//姓名
double weight;//体重(kg)
double height;//身高(cm)
Date bir;//生日
Sex sex;//性别
Car *car;//车子,Car类 类型的成员变量。
}
- (void)drive:(int)far1;//开车,int类型的参数far1 代表我想让车开出去多远。
- (void)print;//输出个人信息。
@end
@implementation Car
//定义Car类方法的实现代码。
- (void)run:(int)far1
{
far = far + far1;//调用参数相加。
NSLog(@"开车一共开了%dkm",far);
//NSLog为输出函数,效果等同于C语言中的printf,为OC的专用,以后会学的。默认结尾自动换行。
}
@end
@implementation Person
//定义Person类方法的实现代码。
- (void)print
{
NSLog(@"%s,性别:%d,体重:%f,身高:%f,生日:%d-%d-%d",name,sex,weight,height,bir.year,bir.month,bir.days);
}
- (void)drive:(int)far1
{
[car run:far1];//在方法中调用自己成员变量对象的方法。
}
@end
int main()
{ //新建一个Person类的对象传地址给p。
Person *p = [Person new];
//下面赋值给p的成员变量。
p->name = "Jack";
p->weight = 60;
p->height = 180;
//Date的结构体赋值最好先复制给一个Date类型的参数,这样方便以后调用。
Date d = {1994,9,10};
p->bir = d;
p->sex = 0;
//新建一个Car类的对象c,并且把这个对象c赋值给对象p的成员变量car。
Car *c = [Car new];
c->far = 120;
p->car = c;
[p print];//调用p的print方法。
[p drive:20];//调用p的drive方法,并且传参给drive方法。
return 0;
}
@end
总结一下,对于类和对象首先要明白的就是两个东西之间的关系,然后牢记创建类的步骤——声明、方法、创建对象、调用方法。还要注意的是一个类的声明 @interface 一定要写在这个类的方法 @implementation 之前,至于把 @implementation 放在哪里是都可以的。
P.S.
对于类和对象的内存,唔,不好讲,等我有时间了上图再说