------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
1.类和对象的概念
类; 类是多个相同事物的集合(抽象)
对象:具体事物也可以指抽象的事物
2.类和对象的关系
1)类的名称:类名
类的属性:一组包含数据的属性
类的方法;允许对象属性中包含的数据进行操作方法
2对象
是系统中基本的运行实体
对象就是类类型的变量
定义了一个类,就可以创建多个对象
一个类就是具有相同类型的对象的抽象
2.类的定义分两部分
1)类的声明(规定当前类的:类名、属性行为)
@interface 类名:父类名
{
//定义类的属性
}
@end
2)类的实现 (实现具体行为)
@implementation 类名
//行为的具体实现
@end
.创建对象访问成员变量
oc中的创建
[Car new]; 做了3件事
1)项计算机申请内存空间
2)给类的每一个成员初始化
3)返回新申请的空间首地址
Car *p =[Car new];
理解1 :定义了一个 Car 类型指针变量,指针变量指向了新申请的空间内存
理解2:实列定义了一个Car 类的对象P
Car *p = [Car new];
3.无参数方法的声明及实现
- (void)方法名;
#import
//车类的声明
@interface Car:NSObject
{ @public
//类的属性
int wheel;
NSString *Name;
int speed;
}
//类的行为,只能写在{}外面
//跑的方法 方法名 run
- (void)run; //定义一个无参数无返回值的方法
- (void)stop;
@end
//类的实现
@implementation Car
//run方法的实现
- (void)run{
NSLog(@"车子跑在了乡间小路上");
}//stop方法的实现
- (void)stop{
NSLog(@"咯吱,车子停了");
}
//行为的具体描述
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
//创建车的类
//创建了一个Car 对象car1
Car * car1 = [Car new];
//创建一类对象的实质还是指针(用指针间接访问实例变量)
car1 ->wheel = 4;
car1->Name = @"奥迪";
car1->speed = 200;
//查看车子的信息
NSLog(@"轮子的个数%d,车子的名字%@,车子的速度%d",car1->wheel,car1->Name,car1->speed);
//方法的调用
[car1 run];
//stop方法的调用 向car1对象发送stop消息
[car1 stop];
}
return 0;
}
4.oc中的方法分类: 对象方法和类方法
对象方法
1)对象方法以-号开头如 -(void)xx;
2)对象方法中可以访问当前对象的成员变量
3)对象方法只能有对象来调用
4)格式调用[对象名 对象方法];
类方法
1)类方法以+开头 +(void)XXX;
2)类方法只能有类调用
3)类方法不能访问实列变量,应为类方法由类调用,并没有创建存储空间来存储类中的成员变量。
4)调用格式;[类名 类方法名];
5)类方法的好处和使用场合
不依赖与对象,执行效率高,能用类方法解决的问题尽量使用类方法;
场合:当不需要使用到成员变量时,可以改为类方法
5.有参数方法的声明实现及调用
带参数的方法的定义和是实现
声明
- (返回值类型)sumOfNum1:(参数类型)Num1 andNum2:(参数类型)Num2;
-(int)sum:(int) x and: (int)y
有参数方法的使用注意:
方法的类型 (—)对象方法
方法的返回值 :int 类型
方法的参数是; x ,y
参数的类型 第一个int 第二个 int
方法 名 sum: and: (注意冒号也是方法名的)
4.oc中的方法分类: 对象方法和类方法
对象方法
1)对象方法以-号开头如 -(void)xx;
2)对象方法中可以访问当前对象的成员变量
3)对象方法只能有对象来调用
4)格式调用[对象名 对象方法];
类方法
1)类方法以+开头 +(void)XXX;
2)类方法只能有类调用
3)类方法不能访问实列变量,应为类方法由类调用,并没有创建存储空间来存储类中的成员变量。
4)调用格式;[类名 类方法名];
5)类方法的好处和使用场合
不依赖与对象,执行效率高,能用类方法解决的问题尽量使用类方法;
场合:当不需要使用到成员变量时,可以改为类方法
#import
typedef enum IphoneColor {KcolorWhite,KcolorBlack,KcolrTHJ} Color;
//手机类的声明
@interface Iphone :NSObject
{ @public
//成员变量
Color _color;//手机的颜色
int _size; //手机的大小
int _cpu; //手机的cpu
}
//查看本机信息声明
- (void)aboutMyPhone;
//打电话 需要参数 电话号码 给谁打电话
- (void)call:(NSString*)name andNum :(NSString*)num;
// 发短信 参数 号码 内容
- (void)sendMessage:(NSString*)num andMessage:(NSString*)neirong;
@end
//手机类的实现
@implementation Iphone
- (void)aboutMyPhone{
NSLog(@"手机的颜色:%d,大小:%d cpu%d :",_color,_size,_cpu);
}
- (void)call:(NSString*)name andNum :(NSString*)num{
NSLog(@"给%@打电话说%@",name,num);
}
- (void)sendMessage:(NSString*)num andMessage:(NSString*)neirong{
NSLog(@"给%@发短信内容%@",num,neirong);
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
//创建对象
Iphone *iphone7plus = [Iphone new];
//设置手机的信息
iphone7plus->_color =KcolorBlack;
iphone7plus->_cpu =8;
iphone7plus->_size= 9;
//查看手机的信息
[iphone7plus aboutMyPhone];
//给1300发短信
[iphone7plus call:@"1300" andNum:@"你在干嘛"];
//给10086打电话
[iphone7plus sendMessage:@"10086" andMessage:@"你好!请问联通的电话号码是多少?"];
}
return 0;
6.对象的存储细节
类创建的对象,每个对象在类存中都占据一定的存储空间,每个对象都有一份属于自己的单独的成员变量,所有的对象公用类的成员方法。方法在整个内存只能怪只有一份,类本省在内存中占据一份空间,
[person new]做了3件事;
1)申请内存空间
2)给实例变量初始化
3)返回空间首地址
1.申请的内存空间在哪个区
申请的空间在内存的堆区(程序动态分配的内存空间)
当new的时候内存的布局是什么样子。
初始化的时候 如果变量是基本数据类型,此时给初始化为0 如果是oc字符串类型 为 null
2.实例变量保存在 什么区? 堆区 p(指针变量)存放在栈区
3.对象方法保存在什么地方? 代码区
4.为什么使用[p run] ;就可以 调用方法了?如何调用?
首先找p对应的堆空间,然后找到_isa指针,再找到_isa指向的代码区的空间,然后到该空间中找方法
一个累可以创建多个对象
7.#pragma mark指令的使用
功能:对代码分组 ,方便查找代码和导航用的
8.函数和对象方法的区别
1)对象方法的实现只能写在@inplementation。。@end之间,对象方法的声明只能写在@interface。。@end中间
2)对象方法都是以-号开头的 类方法+开头的
3)对象方法只能由由对象来调用,类方法只能由类来调用,不能当做函数一样调用。
4)函数属于整个文件,可以写在文件中的任何位置,包括@implementation 。。@end中,但写到@interface 。。@end会无法识别 ,函数的声明可以在main函数外部。
5)对象方法归对象所有
函数 1)所有的的函数都是平行的
2)函数不存在隶属关系
3)使用的时候可以直接调用
4)不可以访问对象中的成员变量
9常见的错误
1)@intrfance @end 和@implementation @end 不能嵌套
2)写@end
3)两个成员变量之间对象的声明顺序(可以吧顺序打乱);
4)成员变量没有写在{}里
5)方法声明写在了{}里
6)在声明不能对类的成员变量进行初始化,请注意成员变量不能脱离对象而独立存在
7)方法无法像函数那样调用
8)成员变量和方法不能用static等关键字修饰,
9)类的实现可以写在mian函数的后面,在使用之前只要声明就可以了。
出错调试
@try{ //语法上检查没有问题,运行时错误的
//有可能会出错的代码
}
@cath(NSException *exception){
//错误的处理方法
NSlog(@"%@",exception);
}
@finally{
}
10 对象和方法之间的关系
对象作为方法的参数
-(void)dispPerson:(Person*)person;
Person *p1 = [Person new];
[p disPerson:p1]//对象作为方法参数
#import
typedef enum Ksex{KsexWomen,Ksexman,Ksexyao}Sex;
//人类的声明
@interface Person :NSObject
{ @public
NSString *_name;
Sex _sex;
}
//对象作为方法参数声明
- (void)dispPerson:(Person *)person;
//对象作为方法的返回值声明
-(Person*)chengSex:(Person*)person;
@end
//人类的实现
@implementation Person
//显示人物性别
- (void)dispPerson:(Person *)person{
NSLog(@"姓名:%@ 性别%d",_name,_sex);
}
//修改人物性别的方法实现
-(Person*)chengSex:(Person*)person{
person->_sex = Ksexman;
return person;
}
11.对象作为方法传递的参数的连续性
实现士兵开枪射击子弹 ,弹夹 。
下面代码是让弹夹对象作为参数先传递到士兵再传递到枪
#import
//子弹夹的声明
@interface Bullet :NSObject
{ @public
int _bulletCount;//子弹数
NSString *_model;//型号
}
@end
//子弹夹的实现
@implementation Bullet
@end
//枪类的声明
@interface Gun :NSObject
{ @public
NSString*_size;//枪的行号
}
- (void)shoot:(Bullet*)bullet;
@end
//枪类的实现
@implementation Gun
- (void)shoot:(Bullet *)bullet{
//判断每子弹是不是大于0
if((bullet->_bulletCount--) >0){
NSLog(@"正在突突的射击,还剩子弹数%d",bullet->_bulletCount);
}else{
NSLog(@"没有子弹了,请换弹夹");
}
}
@end
//士兵的声明
@interface Soldier : NSObject
{ @public
NSString *_name;//姓名
int life ;//生命值
int level;//等级
}
- (void)fireByGun:(Gun*)gun andBllet:(Bullet*)bullet;
@end
//士兵的实现
@implementation Soldier
//射击方法 。需要枪 和弹夹 让枪装上子弹
- (void)fireByGun:(Gun*)gun andBllet:(Bullet*)bullet{
//让枪射击
[gun shoot:(Bullet*)bullet];
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
//创建对象士兵
Soldier *s1=[Soldier new];
s1->level =3;
s1->life =99;
s1->_name=@"小米";
//创建对象枪
Gun *gu = [Gun new];
gu->_size =@"55mm";
//创建对象子弹佳
Bullet *bu =[Bullet new];
bu->_bulletCount = 3;
//士兵射击
[s1 fireByGun:gu andBllet:bu];
[s1 fireByGun:gu andBllet:bu];
[s1 fireByGun:gu andBllet:bu];
}
return 0;
}
12.NSString类的介绍使用
NSString 是oc中字符窜处理的类
1创建字符串
NSString *s =@"banzhang jiecao diaole";
2输出一个字符串
NSLog(@"%@",s);
3.NSString 是一个类
NSString *s1 =[NSString new];
s1 = @"zhoujielun";
4.创建字符串的第三种方式
//格式化创建字符串(按照指定的格式创建字符串)
for(int i=1;i<10;i++){
NSString *imgName = [NSStringWhithFormat: @"xxxxxxxx%02d.jpg",i]
NSLog(@"%@",imgNam);
}
5用一个已经存在的字符串创建一个新的字符串
NSString *s2 ={[NSSring alloc] initWithString:s1];
NSLog(@"s2=%@",s2);
13,计算NSString 字符串的长度
1)字符串是纯英文的
NSString *s1=@"ban";
int len = [s1 length];
NSLog(@"len=%d",len);//3
2)字符串是中文的 oc字符串中英文都死一个字节
NSString *s2 =@"班长节操";
len =[s2 length];
NSLog(@"len=%d",len);//4
3)中英文混合也是一样都是 汉字1个字节。
14.类方法
类方法 :+开头(定义的过程和对象方法一致,只不过开头是+)
类方法的调用: [类名 方法名]
类方法的注意事项 :
1)类方法可以和实例方法同名 ,不影响使用
2类方法也可以是从父类继承而来,子类可以重写类方法,如description方法就可以在子类重新定义
3类方法和实例一样在interface里面声明 在implementation里实现
4)类方法只能被向类发送类方法消息才被执行,向实例对象发送不能执行
5)类方法里使用了self 这个self执行的类对象calss object 而不是实列对象 instance object
15类方法的疑犯错误
1.类方法的优点
1)节省空间
2)提高了效率
3)作为工具方法
错误
1在类方法中不能用类成员,不能访问实例变量
2 在实例方法宏 可以使用类的成员变量
对象方法中可以调用其他的兑现该方法
1)当前对象方法中创建对象,使用新创建的对象调用对象方法
2)可以使用slef
3)对象作为方法参数传递过了,可以使用哪个传递过来的对象调用对象方法
在类方法中中可以调用其他类的方法
1)可以直接使用本类类名(或者其他类名)调用类方法
2)可以使用self
3)对象作为方法参数传递过来
4)可以创建一个对象
5)类方法可以调用其他类方法不能调用自身
16类方法的应用场景
如果我们调用一个方法,该方法不需要使用成员变量,那么我们可以将该方法声明为类方法
17 匿名类 (匿名对象)
匿名对类的第一种使用方法
1.匿名类访问实例变量(只能访问一次),以后访问,实际是访问新的空间
2匿名使用类可以调用方法 使用 [[[Car alloc] init] stop] 使用alloc init 调用stop方法
1.匿名类作为方法参数
- (void)gHome:(Car*)car{
//人开车回家,实质是车在跑
[Car start]
}
匿名类调用方法,参数又是匿名类
[[Person new] goHome:[Car new]];
*/