------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
1.关于类和对象:
1>类关注点: 具有相同属性或行为的对象都可抽象成一个类 ,类是抽象的
类名(第一个字母必须大写,不能有下划线);
属性;
行为(功能)
2>对象:对象是根据类创建而来,是实体。
2.类的声明与实现
声明的作用:1>声明有哪些成员变量。
2>声明有哪些方法。
实现的作用:实现声明中声明的方法,定义方法的作用。
//声明一个Car类(声明对象的属性和行为):
@interface Car :NSObject // (car是类名, :NSObject目的是让Car这个类具有创建对象的能力),也是继承NSObject类中所有属性
{
@public; // 代表所有成员变量都可以被指针间接访问。
int _years; //创建一个years属性(成员变量,默认为0,且不能在此进行初始化),且声明中不能给成员变量赋值
/*
注:成员变量名一定要以下划线__开头:
优点:(1)可以和get方法名区分
(2)可以和普通变量名区分
*/
}
/*
方法(实现,方法之间可以相互嵌套调用,对象方法和类方法之间也可互相调用):
(1)方法名、参数、返回值(声明、实现),放于类的声明和实现中间
(2) 只要是OC对象的方法,必须以减号 - 开头
(3) OC方法中任何数据类型必须用小括号( ) 扩住.(OC小括号作用:扩住数据类型)
*/
- (void) run; //run是方法名,定义一个run的方法 方法存在于类中
@end
//类的实现:(用来实现@interface中声明的方法)
@implementation 类名
//方法的实现(说明方法里有什么代码,也就是说方法是什么功能)
-(void) run
{
NSLog(@"跑起来"); // 哪个对象调用此方法,则去哪个对象内寻找成员属性
}
@end
int main()
{
Car *p=[Car new]; //执行car这个类的new行为来创建对象,并且会返回新对象本身(对象地址),并且定义Car类型指针p 指向对象地址
// 给p所指向对象的years属性赋值 (OC中只能通过指针操作对象)
p->years=20;
[p run]; //给p所指向对象发送一条run消息
}
/*
消息发送机制:
第一步:告诉指针p所指向的对象执行run。
第二步:对象会沿着ISA指针指向的类,在类中寻找run方法。
第三步:当对象在类中找到run方法时,就会调用此方法。
*/
3.类的内存:
1>类在创建对象之前,会将类加载进内存,而且类中存放的是方法列表(不会存放成员属性)
2>每个对象都默认含有ISA指针,此指针指向类,然后每个类都有superclass指向父类。
3>每个对象的成员变量是单独拥有的,方法是共有的。
4.方法和函数区别
(1)对象方法都是减号-开头,方法必须是对象调用、(通过对象调用方法)
(2)对象方法归类对象所有。
1>方法声明写在@interface 和 @end之间
2>方法实现写在@implementation和@end之间
(3)函数跟对象无关系(函数不依赖对象),跟类没有任何联系,函数归整个程序文件所有。
(4)函数不能访问OC对象成员。
(5)函数不能写在@interface和@end之间
注:如果类需要调用结构体,则首先需要使用结构体创建结构体具体数值,然后类才能调用,
eg1:
错误写法:p->birthday={2014,4,2};
正确写法1: p->birthday.year=2014;
p->birthday.month=4;
p->birthday.day=2;
正确写法2: Data d={2014,4,2};
p->birthday=d;
原因:因为结构体只能在定义变量的同时赋值,不能先定义变量,然后再赋值。
注意点:指针使用-> ; 结构体使用.点语法
5. 方法注意点:
1>关于括号:oc方法中,括号只能括住参数类型,
2>关于冒号:问题:一个形参对应一个冒号:,且冒号前最好有描述后面参数的语句
3>关于方法名:
eg1:
-(int)qiuheNum1:(int)num1 andNum2:(int)num2
//以上整个方法返回int类型,形参是num1和num2,形参类型是int。
//方法名是qiuheNum1:andNum2 (冒号与后续描述也是方法名的一部分)