[黑马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整数代替

booleanint

Booleanchar

BOOLunsigned char型,BOOL bb=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定义为1NO定义为0

注意:objective-c并不会将BOOL作为仅能保存YESNO值的真正布尔类型来处理。编译器仍将BOOL认作8位二进制数,YES NO值只是在习惯上的一种理解。

问题:如果不小心将一个大于1字节的整型值(比如shortint)赋给一个BOOL变量,那么只有低位字节会用作BOOL值。如果该低位字节刚好为0(比如8960,写成十六进制为0x2300),BOOL值将会被认作是0,即NO值。而对于bool类型,只有truefalse的区别,即0false,非0true

举例:

BOOL  b1=8960;  //实际是 NO,因为8960换成十六进制为0x2300BOOL只有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).多文件开发创建类


0 0
原创粉丝点击