黑马程序员------OC 对象和类
来源:互联网 发布:谷雨软件下载 编辑:程序博客网 时间:2024/06/05 13:27
------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]];
*/
- 黑马程序员---OC类和对象
- 黑马程序员--OC类和对象
- 黑马程序员-OC语言-类和对象
- 黑马程序员---OC基础---类和对象
- 黑马程序员------OC 对象和类
- 黑马程序员--oc语言类和对象
- 黑马程序员-OC——类和对象
- 黑马程序员——OC类和对象
- 黑马程序员——OC——类和对象
- 黑马程序员——OC语言中的类和对象
- 黑马程序员——OC中类和对象
- 黑马程序员-OC语言类和对象
- 黑马程序员--06OC类和对象
- 黑马程序员-OC学习笔记-----类和对象
- 黑马程序员——OC-4:类和对象
- 黑马程序员--IOS学习日记:02--OC类和对象
- 黑马程序员——OC基础:类和对象
- 黑马程序员——OC基础:类和对象
- 第69讲:Scala并发编程react、loop代码实战详解学习笔记
- 央视为什么要剑指谷歌
- socket、Tcp/IP通信
- Leetcode28 Implement strStr()
- 拓扑排序,AOV网络,AOE网络
- 黑马程序员------OC 对象和类
- Ogre 1.9 英文文本显示
- 在Ubuntu 14.04 64上安装gevent_zeromq-0.2.5
- Leetcode: Contains Duplicate II
- 抽象类(abstract class)和接口(interface)有什么异同?
- jstat
- Fragment的基本内容
- Linux命令之文件管理篇
- 关于Unity Package无法导入的问题