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

本文详细阐述了面向对象编程的基本概念,通过实例展示了对象、属性、方法的定义与实现,以及对象之间的交互与关系。重点讲解了如何利用类创建对象,如何在对象间传递方法调用,并通过具体案例说明了类、方法、对象之间的相互作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//创建对象
       
//[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 = @"陈自超";
       
//先给人一条狗,不然_dognull
        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、付费专栏及课程。

余额充值