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 = @"陳自超";
       
//先給人一條狗,不然_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作爲程序的入口。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章