OC-1-对象的存储细节、#progma mark指令、NSString类

// 创建对象
       
//[Person new];
       
// 做了三件事
       
// 分配空间,初始化,返回空间的首地址
       
Person *p = [ Person new ];
        p->
_age = 24 ;
        p->
_name = @" 陈自超 " ;
       
       
NSLog ( @" 你叫 %@ ,年龄 %d 岁! " , p-> _name , p-> _age );
       
// 调用方法
        [p run];
1、申请的空间在内存的哪个区?
     //new的时候申请的空间在内存的堆区(程序动态分配的内存空间)
     //当new的时候内存的布局是这样的
     //实例变量初始化:基本数据类型:初始化为0
                    OC字符串类型:NULL                     
2、实例变量又保存在什么地方?
     //实例变量在堆区
     //p 存放在栈区
3、对象方法保存在什么地方?
     //对象方法在代码区
4、为什么使用 [p run];就可以调用方法了?如何调用?
     //首先找到p对象的堆区的空间,然后找到 _ isa指针,再找到 _ isa 指针指向的代码区的空间,然后在该空间去找方法
5、一个类可以实例化多个对象
     //代码区的类只加载一次
     //不同的对象在内存中的地址是不同,所以各个成员变量的地址也不相同

一个对象系统自动初始化



两个对象自己赋值







#pragma mark指令

功能:对代码分组,方便代码查询和导航

#pragma mark  - :出现一条分割线

对象和方法之间的关系:1、对象作为方法的参数
                                        2、对象作为方法返回值


/*
 
设计一个狗类
 1
)属性
 *
颜色
 *
速度(单位 m/s
 *
性别
 *
体重(单位 kg
 
 2
)行为
 *
吃:每吃一次体重增加 0.5 ,输出吃完后的体重
 *
吠(叫):输出所有的属性
 *
跑:每跑一次,体重减少 0.5 ,输出速度和跑完后的体重
 *
比较颜色:跟别的狗比较颜色。如果一样,两个值做减法得零,返回 NO ,不一样,做减法得非零值,返回 YES
 *
比较速度:跟别的狗比较速度,返回速度差(自己的速度 - 其他狗的速度)
 
 
 
人类
 1
》属性
 *
姓名
 *
狗(养了一条狗)
 
 2
》行为
 *
喂狗:每喂狗依次,购会执行吃的行为
 *
遛狗:每遛狗依次,狗会执行跑得行为
 */


#import <Foundation/Foundation.h>

// 定义狗的颜色的枚举
typedef enum {kColorWhite, kColorYellow, kColorHua, kColorBlack} Color;

// 定义狗的性别枚举
typedef enum {kSexGong, kSexMu, kSexYao} Sex;

// 声明狗类
#pragma mark 狗类的声明
@interface Dog : NSObject
{
   
@public
   
// 属性
   
Color _color;
   
float _speed;
   
Sex _sex;
   
float _weight;
}
// 方法
-(
void ) eat:( NSString *) foodName; //
-(
void ) bark; //
-(
void ) run; //
-(
BOOL ) isCompareColorWithOther:( Dog *) Dog; // 比较颜色 , 传一个狗对象
-(
float ) isCompareSpeedWithOther:( Dog *) Dog; // 比较速度

@end

// 方法实现
#pragma mark 狗类的实现
@implementation Dog

// 方法具体实现
-(
void ) eat:( NSString *) foodName {
   
_weight += 0.5f ;
   
NSLog ( @" 狗正在吃 %@ ,狗的体重: %.2f(kg)" , foodName, _weight );
}
//
-(
void ) bark {
   
   
NSLog ( @" 狗的颜色: %d ,狗的速度: %.2f(m/s) ,狗的性别: %d ,狗的体重: %.2f(kg)" , _color , _speed , _sex , _weight );
}
//
-(
void ) run {
   
_weight -= 0.5 ;
   
NSLog ( @" 狗的速度: %.2f(m/s) ,狗的体重: %.2f(kg)" , _speed , _weight );
}
//
-(
BOOL ) isCompareColorWithOther:( Dog *)Dog {
 
   
// 当前狗的颜色       另外一条狗的颜色
   
if ( _color == Dog-> _color ) {
       
return YES ;
    }
else {
       
return NO ;
    }
   
}
// 比较颜色
-(
float ) isCompareSpeedWithOther:( Dog *)Dog {
  
   
return fabsf ( _speed - Dog-> _speed );
}
// 比较速度

@end

#pragma mark -
// 声明人类
#pragma mark 人类的声明
@interface Person : NSObject
{
   
@public
   
// 属性
   
NSString *_name;
   
Dog *_dog;
}
// 方法的声明
// 喂狗
-(
void ) feedDog:( NSString *) foodName;
// 遛狗
-(
void ) liuDog;
@end

#pragma mark 人类的实现
@implementation Person

// 喂狗
-(
void ) feedDog:( NSString *) foodName {
   
//_dog 狗吃东西
    [
_dog eat :foodName];
}
// 遛狗
-(
void ) liuDog {
   
//_dog 狗跑起来
    [
_dog run ];
}
@end

int main( int argc, const char * argv[]) {
   
@autoreleasepool {
      
// 创建狗对象 1
       
Dog *p1 = [ Dog new ];
        p1->
_color = kColorHua ;
        p1->
_speed = 15.2f ;
        p1->
_sex = kSexYao ;
        p1->
_weight = 45.5f ;
       
//        // 狗对象 2
//        Dog *p2 = [Dog new];
//        p2->_color = kColorBlack;
//        p2->_speed = 20.5f;
//        p2->_sex = kSexGong;
//        p2->_weight = 40.5f;
       
//        [p1 eat:@" 牛肉汤 "];
//        [p1 bark];
//        [p1 run];
//       
//        // 返回值 1 相同
//        BOOL isSameColor = [p1 isCompareColorWithOther:p2];
//        NSLog(@"isSameColor = %d", isSameColor);
//       
//        float cha = [p1 isCompareSpeedWithOther:p2];
//        NSLog(@" 两只狗速度相差 %.2f(m/s)", cha);
       
// 创建人对象
       
Person *m = [ Person new ];
        m->
_name = @" 陈自超 " ;
       
// 先给人一条狗,不然 _dog null
        m->
_dog = p1;
       
       
// 方法调用,人喂狗
        [m
feedDog : @" 狗骨头 " ];
       
// 人遛狗
        [m
liuDog ];
    }
   
return 0 ;
}

对象作为方法的参数连续传递

/*
 
实现功能:士兵开枪,枪射击子弹
 
 
枪类
 
名称: Gun
 
属性:型号( _size , 子弹个数( _bulletCount
 
行为:射击
 
 
人类
 
名称: Soldier
 
属性:姓名( _name ),等级( _level ),血量( _life
 
行为:跑 开枪
 
 
子弹类
 
名称: Bullet
 
属性:子弹个数,型号( _model
 
 */



#import <Foundation/Foundation.h>

// 子弹连续传递了两次
#pragma mark 子弹类的声明
@interface Bullet : NSObject
{
   
@public
   
NSString *_size;
   
int _bulletCount;
}

@end
#pragma mark 子弹类的实现
@implementation Bullet

@end

#pragma mark 枪类的声明
@interface Gun : NSObject
{
   
@public
   
// 属性
   
NSString *_size;
//    int _bulletCount; // 普通
}
-(
void ) shoot:( Bullet *) bullet;
@end
#pragma mark 枪类的实现
@implementation Gun
-(
void ) shoot:( Bullet *) bullet {
   
// 每射击一次,子弹个数 -1
   
if (bullet-> _bulletCount > 0 ) {
        bullet->
_bulletCount --;
       
NSLog ( @"%@ 正在突突的射击。。。 , 剩余子弹: %d" , _size , bullet-> _bulletCount );
    }
else {
       
NSLog ( @" 蠢驴,没子弹了! " );
    }
   
}
@end

#pragma mark -
//#pragma mark 士兵类的声明 - 普通
//@interface Soldier : NSObject
//{
//    @public
//    NSString *_name;
//    int _life;
//    int _level;
//   
//}
//-(void) fireByGun:(Gun *) gun;
//@end
//#pragma mark 士兵类的实现 - 普通
//@implementation Soldier
//-(void) fireByGun:(Gun *) gun {
//    // 让枪射击
//    [gun shoot];
//}
//@end
#pragma mark 士兵类声明 - 高级
@interface Soldier : NSObject
{
   
@public
   
NSString *_name;
   
int _life;
   
int _level;
}
-(
void ) fireByGun:( Gun *) gun andBullet:( Bullet *) bullet;
@end
#pragma mark 士兵类实现 - 高级
@implementation Soldier
// 开枪,传了子弹和弹夹
-(
void ) fireByGun:( Gun *) gun andBullet:( Bullet *) bullet {
   
// 让枪装上子弹,然后射击
    [gun
shoot :bullet];
}
@end

int main( int argc, const char * argv[]) {
   
@autoreleasepool {
       
// 创建枪对象
       
Gun *g = [ Gun new ];
        g->
_size = @"AK47" ;
//        g->_bulletCount = 1;
       
       
// 创建士兵对象
       
Soldier *s = [ Soldier new ];
        s->
_name = @" 许三多 " ;
        s->
_life = 100 ;
        s->
_level = 5 ;

//        [s fireByGun:g];
//        [s fireByGun:g];
       
// 创建子弹
       
Bullet *myBullet = [ Bullet new ];
        myBullet->
_size = @"5mm 口径 " ;
        myBullet->
_bulletCount = 3 ;
       
        [s
fireByGun :g andBullet :myBullet];
        [s
fireByGun :g andBullet :myBullet];
        [s
fireByGun :g andBullet :myBullet];
        [s
fireByGun :g andBullet :myBullet];
    }
   
return 0 ;
}


NSString类: 字符串处理的类之一
1、创建常量字符串,注意使用@
2、输出字符串,注意%@
3、格式化穿件字符串
NSString *imgName = [ NSString stringWithFormat : @"xxxx%02d, 1" ] ;
4、用已经能够存在的字符串创建一个新的字符串
  NSString *s2 = [[nsstring alloc] initWithString:s1];

NSString字符串长度计算
// 计算 NSString 字符串长度
        
//1 、字符串纯英文
       
NSString * s1 = @"chenzichao" ;
       
NSUInteger len = [s1 length ];
       
NSLog ( @"len = %ld" , len);
        
//2 、字符串纯中文
       
//OC 字符串中英文都一个字符占一个字节, C 语言中, UTF-8 ,一个汉字三个字节
       
NSString *s2 = @" 陈自超 " ;
        len = [s2
length ];
         //3、中英文混合



OC的多文件开发
不同的类放到不同的文件中,每个类的声明和实现分开,声明写在.h文件职工,实现放在相应地.m文件中,类名是什么,文件名前缀就是什么。main.m作为程序的入口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值