您的位置:首页 > 职场人生

黑马程序员------OC 对象和类

2015-07-27 22:45 465 查看
------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 <Foundation/Foundation.h>
//车类的声明
@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 <Foundation/Foundation.h>
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 <Foundation/Foundation.h>
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 <Foundation/Foundation.h>
//子弹夹的声明
@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]];

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: