[黑马IOS自学第九篇]OC语言基础,面向对象概念,类的创建,OC多文件开发等

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;

typedefsigned charBOOL

#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(@"到达目的地,车停止运行");
}
@end
int 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 ;
}
 
@end
int 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);
}
@end
int 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;
}
@end
int 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;
}
 
 
@end
int 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值