[黑马IOS自学第九篇]OC语言基础,面向对象概念,类的创建,OC多文件开发等
来源:互联网 发布:淘宝图片轮播在线制作 编辑:程序博客网 时间:2024/05/19 02:23
Extends Coc 、EnhancedCc++/ 、C-like c#
会在github上开源一个库,如果是私有库要交钱,自己o公司的项目不要勾
会把源代码提交上去
<span style="font-size:14px;">//引入头文件//C中引入头文件的方式//系统为尖括号<> include也可以用//#include<Foundation/Foundation.h>//import引入的头文件可以防止重复包含 include使用预处理指针防止重复包含// import和 @class区别//<Foundation/Foundation.h>//1./Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/Foundation.framework/Headers/Foundation.h//oc的库文件都引过来了 #import<Foundation/Foundation.h>// 参数数目 参数值int main(intargc,const char* argv[]) { @autoreleasepool { //@autoreleasepool自动释放池,用于回收对象的存储空间(内存管理范畴) //insert code here... NSLog(@"Hello, World!");//日志输出函数 } return 0; //0表示正常退出} </span>
一.NSLog和NSString基本认识
NSLog Cocoa框架中提供一个方法
NSLOG定义在NSObjCRuntime.h中
传递进去的是NSString格式化字符串
#import<Foundation/Foundation.h> int main(intargc,const char* argv[]) { @autoreleasepool { //insert code here... NSLog(@"Hello,World!"); //NSLog包含换行符 //NSLog会打印日志时间,名称等项目信息 //NSLog函数参数是一个NSString对象 //printf是一个字符串常量指针 //NSlog格式化输出问题 int a = 5 ; NSLog(@"%d",a); char *str ="黑马程序员"; NSLog(@"---->%s",str); //OC中自己特有字符串表示方法 NSString *str1 = @"abc"; NSLog(@"%@",str1); printf("%s",str1);// //printf不能打印NSString对象 //向下兼容 } return 0;}
2015-11-23 09:36:17.912 NSLOG函数[10643:1425615] Hello, World!
2015-11-23 09:36:17.913 NSLOG函数[10643:1425615] 5
2015-11-23 09:36:17.914 NSLOG函数[10643:1425615] ---->
2015-11-23 09:36:17.914 NSLOG函数[10643:1425615] abc
X\354\377
C的模块化编程在OC中也适用
OC的数据类型
//OC提供一种增强型for循环 #import<Foundation/Foundation.h> int main(intargc,const char* argv[]) { @autoreleasepool { NSArray *arr =@[@"one",@"two",@"Three"]; for (NSString*str in arr) { NSLog(@"%@",str); } } return 0;}
定义和声明的差异
OC称函数为方法没有函数的概念
+(void)test;
-(void)test;
-(int)max:(int)x and Y:(int)y;同 int max(int x,int y)
OC新增数据类型
1)逻辑型
Boolean 可取trueorfalse,也可以用 0或非0整数代替
boolean是int型
Boolean是char型
BOOL是unsigned char型,BOOL b当b=1 b=YES
bool 是int型,bool b 当b>1 b=YES
bool t1 =1;//true or false
BOOL t2 = 3;//YES or NO
Boolean t3 =1; //unsigned char type
boolean_t t4 = 1;//int type
NSAssert(t1,@"bool t1 is NO");//通过测试
NSAssert(t2,@"BOOL t2 is NO");//通过测试
NSAssert(t3,@"Boolean t3 isNO");//通过测试
NSAssert(t4,@"boolean_t t4 isNO");//通过测试
typedefunsignedchar Boolean;
typedefsignedcharBOOL;
#definebool _Bool
看底层,需要C语言基础
说明:objective-c中的BOOL实际上是一种对带符号的字符类型(signed char)的类型定义(typedef),它使用8位的存储空间。通过#define指令把YES定义为1,NO定义为0。
注意:objective-c并不会将BOOL作为仅能保存YES或NO值的真正布尔类型来处理。编译器仍将BOOL认作8位二进制数,YES和 NO值只是在习惯上的一种理解。
问题:如果不小心将一个大于1字节的整型值(比如short或int)赋给一个BOOL变量,那么只有低位字节会用作BOOL值。如果该低位字节刚好为0(比如8960,写成十六进制为0x2300),BOOL值将会被认作是0,即NO值。而对于bool类型,只有true和false的区别,即0为false,非0为true。
举例:
BOOL b1=8960; //实际是 NO,因为8960换成十六进制为0x2300,BOOL只有8位存储空间,取0x2300的低8位,00,所以是NO
bool b2=8960;//实际是true,因为bool类型,非0即为true。
二.面向对象:
采用基于对象的概念建立模型,莫尼克客观事件的系统思维方式,分析,设计实现软件的方法。
1).面向过程:解决软件复用和设计编程的方法
2).面向对象三个特性:
封装,
多态,
继承
抽象(基础班没有讲)
区别
面向过程:强调的是功能行为, 关注的是解决问题需要哪些步骤
面向对象:
将功能封装对象,强调具备了功能的对象
关注的是解决问题需要哪些对象
面向对象时基于面向过程的
类是一类具有相似内部状态(共同特征)和运动规律的实体集合
对象各种各样的实体,具有相同类型的类的抽象例如:整数123苹果,水杯,具有相似内部状态和运动规律
消息对象之间相互联系和相互作用的方式
一个类可以实例化多个对象
类的构成:
名称、属性、行为
类的抽象 (拥有相同或者类似属性和行为的对象抽象出一个类)
方法:名词提炼成一个类
类:
鸟,猪,障碍物(箱子,石头,炸药),地图(背景)
属性:
颜色大小
行为:
扔爆炸显示分数
类,包,接口,继承,对象,多态
3).类的声明和实现
[Car new];
//1.向计算机申请内存空间
//2.给类中的每一个成员初始化值
//3.返回新申请空间的首地址
Car *car =[Car new];
//理解方式1
//定义了一个Car类型指针变量
//指针变量指向新申请的内存空间
//理解方式2
//用Car类实例化一个实例对象,对象名称是car
4).无参方法的声明和实现
//// main.m// 类的声明和实现//// Created by CHINGWEI_MACPC on 15/11/23.// Copyright © 2015年 itcast. All rights reserved.// #import<Foundation/Foundation.h>@interface Car :NSObject{ //类的属性@public;//默认不添加,无法访问 int wheel ; NSString *color ; int speed ; }//类的行为-(void) run;//定义一个无参无返回值的方法-(void) stop;@end //类的实现@implementation Car//行为具体描述//方法的具体实现// '-'开头为对象方法,只能用对象调用-(void) run{ NSLog(@"车在行驶中...");}-(void) stop{ NSLog(@"到达目的地,车停止运行");}@endint main(intargc,const char* argv[]) { @autoreleasepool { Car *car1 = [Car new]; car1->color=@"blue"; car1->speed=150; car1->wheel=4; NSLog(@"轮子:%d,速度:%d,颜色:%@", car1->wheel,car1->speed,car1->color); //方法调用 [car1 run]; [car1 stop]; } return 0;}
//
// main.m
// 有参方法的声明和实现
//
// Created by CHINGWEI_MACPC on 15/11/23.
// Copyright © 2015年 itcast. All rights reserved.
//
#import<Foundation/Foundation.h>@interface Calculator:NSObject{@public; int num3 ,num4;}-(int)sum:(int)num1 and:(int)num2;-(int)sum2;@end @implementationCalculator//方法名 sum: and:-(int)sum:(int)num1 and:(int)num2{ return num1 + num2 ;}-(int)sum2{ return num3+ num4 ;} @endint main(intargc,const char* argv[]) { @autoreleasepool { Calculator *cal1 = [Calculator new]; cal1->num3 = 34; cal1->num4 = 35; int result = [cal1 sum:cal1->num3and:cal1->num4]; NSLog(@"%d",result); result = [cal1 sum2]; NSLog(@"%d",result); } return 0;}
// Iphone类声明
//
// Created by CHINGWEI_MACPC on 15/11/23.
// Copyright © 2015年 itcast. All rights reserved.
//
#import<Foundation/Foundation.h>typedefenumcolor{kColorWhite,kColorBlack,kColorGold} iColor;@interface Iphone:NSObject{//类的属性(实例变量,成员变量) //手机颜色@public; iColor _color ; float _size ; NSString *_cpu; }//类的行为(方法)//查看手机的信息,实质:把手机的实例值打印出来-(void)aboutMyPhone;-(void)callPhone:(NSString*)telNum;-(void)sendMessage:(NSString*)telNum andContent:(NSString*) content; @end @implementation Iphone-(void)aboutMyPhone{ NSLog(@"颜色:%d,大小:%.2f,cpu:%@",_color,_size,_cpu); } -(void)callPhone:(NSString*)telNum{ NSLog(@"对方电话号码:%@",telNum); } -(void)sendMessage:(NSString*)telNum andContent:(NSString*) content{ NSLog(@"发短信至:%@,短信内容:%@",telNum,content);} @end int main(intargc,const char* argv[]) { @autoreleasepool { Iphone *ip7 = [Iphone new]; ip7->_color=kColorBlack; ip7->_cpu=@"A10"; ip7->_size=5.7f; [ip7 aboutMyPhone]; [ip7sendMessage:@"10086"andContent:@"剩余流量"]; [ip7 callPhone:@"13800138000"]; } return 0;}
2015-11-23 16:29:23.879 Iphone类声明[1043:72539]颜色:1,大小:5.70,cpu:A10
2015-11-23 16:29:23.880 Iphone类声明[1043:72539]发短信至:10086,短信内容:剩余流量
2015-11-23 16:29:23.880 Iphone类声明[1043:72539]对方电话号码:13800138000
Program ended with exit code: 0
#import<Foundation/Foundation.h>@interface WalkToKeepFit:NSObject{@public; int steps ; float fat;}-(float)cutFat;-(float)eat:(int)times;@end @implementationWalkToKeepFit-(float)cutFat{ float curentFat = fat; NSLog(@"curentFat= %f",curentFat); while (steps/100) { curentFat-=0.2f; steps-=100; } return curentFat;}-(float)eat:(int)times{ fat = fat+times*0.6f; return fat ;}@end int main(intargc,const char* argv[]) { @autoreleasepool { WalkToKeepFit *wtf = [WalkToKeepFit new]; wtf->fat = 3.f; [wtf eat:3]; wtf->steps =350; float curFat =[wtf cutFat]; NSLog(@"now fat is %.2f",curFat); } return 0;}
老师代码
#import<Foundation/Foundation.h>@interface Person:NSObject{@public; NSString *_name ; int _age ; float _weight;}//功能是人可以吃各种食物//每次散步,让体重-0.2-(void)walk:(int)steps;-(void)eat:(NSString*)foodName;@end @implementation Person-(void)walk:(int)steps{ _weight-=steps/100*0.2f; NSLog(@"%@您走了%d步,您当前体重为 %f",_name,steps,_weight);}-(void)eat:(NSString*)foodName{ _weight += 0.6f; NSLog(@"您吃了 %@",foodName);}@endint main(intargc,const char* argv[]) { @autoreleasepool { Person *person1 = [Person new ]; person1->_weight=180.f; person1->_age = 30; person1->_name=@"jack"; [person1eat:@"橘子"]; [person1 walk:600]; } return 0;}
对象的存储细节
类创建对象,每个对象在内存中都占据一定的存储空间,每个对象都有自己的单独成员变量,所有的对象公用类的成员方法,方法在整个内存中只有一份,类本身再内存中占据一份存储空间,类的方法存储于此。
//1.申请的空间在内存的哪个区
//new的时候申请的空间在内存的堆区(程序动态分配的内存空间)
//_isa指针存放此内存堆区的类属于哪个代码区类的地址
//2.实例变量又保存在什么地方
// person1(指针变量名)是局部变量存放在栈区p指向内存堆区的空间
,[person1 new ]在堆中开辟一个内存空间
//3.对象方法保存在什么地方
//代码区域
//4.为什么使用[person1 run]就可以调用方法?如何调用的
//根据p的地址找对应的堆区的空间,在堆区的_isa指针,再到_isa指向的代码区,然后在对应的空间找到run方法
5).一个类创建多个对象
#pragma mark
方便代码的查找和导航
多一条分割线,方便代码导航
三、函数和对象方法的区别
对象方法
对象方法只能对象调用[person1run];
对象方法归对象所有,不能这个类调用另一个类的方法
类方法只能由类调用
-(void)run;
函数在@interface和 @end之间也能被调用,属于整个文件,写在文件的任何位置,都可以被调用
所有函数属于平行关系
不可以访问对象中的成员变量
void run(){
}
四、常见错误汇总
(1).@interface @end @implementation @end不能嵌套
声明和实现必须同时存在
两个类的声明实现的顺序可以打乱
(2).声明的时候不能对类的成员变量初始化,成员变量不能脱离对象而存在
(3).成员变量和方法不能用static等关键字修饰(@public @protocal @private)
(4).类的实现可以写在main函数之后,
(5).定义了成员方法却没实现
加入异常捕捉代码,将异常结果exception 打印出来
#import<Foundation/Foundation.h>typedefenum{KSexMan,KSexWoman,KSexChild} iSex;@interface Person:NSObject{@public; NSString *_name ; int _age ; iSex _sex ;}-(void)run:(Person*)person;-(Person *)change:(Person*)person;@end @implementation Person//对象方法参数为对象的情况-(void)run:(Person*) person{ NSLog(@"姓名:%@,性别:%d",person->_name,person->_age);}//返回值为对象的情况修改对象的性别-(Person *)change:(Person*)person{ person->_sex=KSexWoman; return person;}@endint main(intargc,const char* argv[]) { @autoreleasepool { Person *p = [Personnew]; Person *p1 = [Person new]; p1->_name=@"liniu"; p1->_sex=KSexWoman; Person *p2 = [Person new]; p2->_name=@"Qiniu"; p2->_sex=KSexMan; [p run:p1]; [p run:p2]; Person *p3 = [Person new]; p3 = [p change:p2]; NSLog(@"姓名:%@,性别:%d",p3->_name,p3->_sex); } return 0;} #import<Foundation/Foundation.h>#pragma mark人的类声明和实现#pragmamark -#pragma mark狗类的声明和实现typedefenum{KColorWhite,KColorYellow,KColorBlack} iColor;typedefenum{KSexMale,KSexFeMale} iSex;@interface Dog:NSObject{@public; iColor _color ; float _weight ; iSex _sex ; int _speed ; }-(void)eat:(NSString*)foodName;-(void)run;-(void)bark;-(BOOL)isCompareColorWithOther:(Dog *)dog;-(int)CompareSpeedWithOther:(Dog *)dog; @end #pragmamark -#pragma mark人的类声明和定义@interface Person:NSObject{@public; NSString *_name ; Dog *_dog;}-(void)feedDog:(NSString*)foodName;-(void)walkTheDog;@end @implementation Person-(void)feedDog:(NSString*)foodName{ [_dogeat:foodName];}-(void)walkTheDog{ [_dogrun];} @end @implementation Dog-(void)eat:(NSString*)foodName{ _weight+=0.5f; NSLog(@"正在吃东西:%@",foodName);}-(void)run{ _weight-=0.5f; NSLog(@"正在以%d的速度跑步",_speed);}-(void)bark{ NSLog(@"%d,%d,%f",_color,_sex,_weight); }-(BOOL)isCompareColorWithOther:(Dog *)dog{ if (_color ==dog->_color) { return YES; } else return NO;}-(int)CompareSpeedWithOther:(Dog *)dog{ return _speed -dog->_speed;} @endint main(intargc,const char* argv[]) { @autoreleasepool { Dog *d1 =[Dognew ]; d1->_speed = 80; d1->_weight = 20; d1->_sex =KSexFeMale; d1->_color =KColorBlack; Person *p = [Personnew ]; // [p feedDog:@"肉骨头"];无法调用方法 //相当于nil->feedDog p->_dog =d1; [pfeedDog:@"肉骨头"]; } return 0;}
2).对象作为方法的参数连续传递
//// main.m// 对象作为方法的参数连续传递2//// Created by CHINGWEI_MACPC on 15/11/25.// Copyright © 2015年 itcast. All rights reserved.// #import<Foundation/Foundation.h>#pragmamark -#pragma mark子弹声明#pragma mark子弹实现@interface Bullet:NSObject{@public; int _bulletCount; NSString *_size ; }@end@implementation Bullet{ } @end #pragma mark枪类声明#pragma mark枪类实现@interface Gun:NSObject{@public; NSString *_size ;}-(void)shoot:(Bullet*)_bullet;@end@implementation Gun-(void)shoot:(Bullet*)_bullet{ if(_bullet->_bulletCount){ _bullet->_bulletCount--; NSLog(@"%@的枪正在射击还剩下%d子弹",_size,_bullet->_bulletCount); } else{ NSLog(@"子弹没了,请上子弹"); }}@end#pragmamark -#pragma mark士兵声明#pragma mark士兵实现@interface Soilder:NSObject{@public; NSString *_name ; int _life; int _level ;}-(void)fireByGun:(Gun*)_gun andBullet:(Bullet *)bullet;@end@implementation Soilder-(void)fireByGun:(Gun*)_gun andBullet:(Bullet *)bullet{ [_gun shoot:bullet];} @end int main(intargc,const char* argv[]) { @autoreleasepool { Soilder *s =[Soildernew]; s->_name =@"yui"; s->_life=98; s->_level =2 ; Gun *gun = [Gunnew ]; gun->_size=@"小米3"; Bullet *myBullet = [Bullet new]; myBullet->_bulletCount =3; myBullet->_size=@"854"; [s fireByGun:gun andBullet:myBullet]; [s fireByGun:gun andBullet:myBullet]; [s fireByGun:gun andBullet:myBullet]; [s fireByGun:gun andBullet:myBullet]; //mybullet作为对象参数传递两次 } return 0;}
2015-11-25 18:53:59.672对象作为方法的参数连续传递2[7005:783801]小米3的枪正在射击还剩下2子弹
2015-11-25 18:53:59.674对象作为方法的参数连续传递2[7005:783801]小米3的枪正在射击还剩下1子弹
2015-11-25 18:53:59.674对象作为方法的参数连续传递2[7005:783801]小米3的枪正在射击还剩下0子弹
2015-11-25 18:53:59.675对象作为方法的参数连续传递2[7005:783801]子弹没了,请上子弹
Program ended with exit code: 0
错误写法,因为car1并不知道{ }是数组初始化还是结构体初始化,所以报错
强制转换成struct类型就可以=
用结构体变量作为对象变量传递
#import<Foundation/Foundation.h>typedefstruct { int year ; int month ; int day ; }myDate;@interface Student:NSObject{@public; NSString *_name ; //学生生日结构体 myDate _birthday ; }@end@implementation Student @end int main(intargc,const char* argv[]) { @autoreleasepool { Student *student = [Student new]; //方法1 student->_birthday = (myDate){1983,12,12}; //方法2 myDate d1 ={1983,12,12}; student->_birthday = d1; NSLog(@"%d,%d,%d",student->_birthday.year,student->_birthday.month,student->_birthday.day ); //方法3 student->_birthday.year = 1983; student->_birthday.month = 12; student->_birthday.day = 12 ; } return 0;}
3).Nstring类介绍及用法
#import<Foundation/Foundation.h> int main(intargc,const char* argv[]) { @autoreleasepool { //OC 字符串处理的类 //方法1 NSString *abc =@"this is astring"; NSLog(@"%@",abc); //方法2 NSString *str = [NSString new]; str = @"sdwe"; NSLog(@"%@",str); //方法3格式化创建字符串 //02d占位符占用2位 for(inti = 0 ;i < 10;i++){ NSString *imgName = [NSString stringWithFormat:@"xxxx%02d.jpg",i]; NSLog(@"%@",imgName); } //方法4用一个已经存在的字符串创建一个新的字符串 NSString *str2 = [[NSString alloc] initWithString:str]; NSLog(@"%@",str2); } return 0;}
// Nsstring字符串长度计算
//
// Created by CHINGWEI_MACPC on 15/12/1.
// Copyright © 2015年 itcast. All rights reserved.
//
#import<Foundation/Foundation.h> int main(intargc,const char* argv[]) { @autoreleasepool { NSString *abc = @"this is astring"; //intlen = (unsigned)[abc length]; //NSLog(@"%d",len); NSUInteger len = [abc length]; NSLog(@"%ld",len);//16 //OC中,字符串都是一个字符和英文一样 NSString *chinese =@"中文"; len = [chinese length]; NSLog(@"%ld",len);//2 //OC中,字符串都是中文字符和英文一样 NSString *str3 =@"中文!"; //intlen = (unsigned)[abc length]; //NSLog(@"%d",len); len = [str3 length]; NSLog(@"%ld",len);//3 //而c语言在UTF-8中一个汉字占用3个字节 } return 0;}
4).多文件开发创建类
- [黑马IOS自学第九篇]OC语言基础,面向对象概念,类的创建,OC多文件开发等
- [黑马IOS自学第十一篇]OC语言基础,SELF关键字,面向对象概念,类学习多态,继承@property等
- [黑马IOS自学第十篇]OC语言基础,面向对象概念,类学习
- 黑马程序员IOS-OC语言-面向对象
- iOS开发-Day13-OC基础、面向对象
- 黑马程序员---iOS基础---OC中类创建对象
- 黑马程序员——IOS基础——OC面向对象七类的深入
- 黑马程序员——ios开发基础之OC中的面向对象以及对象特性
- 黑马程序员--IOS基础:OC--类的定义和对象的创建
- 黑马程序员-OC语言基础:面向对象语法 一
- 黑马程序员-OC语言基础:面向对象语法 二
- 黑马程序员-OC语言基础:面向对象语法 三
- 黑马程序员-OC语言基础:面向对象语法 四
- 黑马程序员-IOS-OC基础-面向对象语法一
- 黑马程序员-IOS-OC基础-面向对象语法二
- 黑马程序员-IOS-OC基础-面向对象语法
- 黑马程序员-IOS-OC基础-面向对象语法二
- 黑马程序员-IOS-OC基础-面向对象语法三
- stack 改进版
- 常见排序及搜索算法
- CVPR2015 interesting paper(Part 1)
- Android第三方FloatingActionButton:伴随ListView、RecyclerView、ScrollView滚动滑入滑出
- 三、位操作(来自wiki)
- [黑马IOS自学第九篇]OC语言基础,面向对象概念,类的创建,OC多文件开发等
- 基础练习 龟兔赛跑预测
- awk之变量篇
- graylog2 实践
- oracle数据库OEM登录初级问题
- 2. wordpress 友情链接的备份和导入
- java编程之旅第四章——变量下(数据类型转换)
- PHP的一些小细节
- viewPager实现tab标签位置重新排序(仿网易新闻主页专题改变排序)