OC语言-类与对象
OC语言-类与对象
盘盘的灰灰 发表于2年前
OC语言-类与对象
  • 发表于 2年前
  • 阅读 8
  • 收藏 0
  • 点赞 0
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

  • 类加载.

         1). 在创建对象的时候 肯定是需要访问类的.

         2). 声明1个类的指针变量也会访问类的.

         在程序运行期间 当某个类第1次被访问到的时候. 会将这个类存储到内存中的代码段区域.这个过程叫做类加载.

         只有类在第1次被访问的时候,才会做类加载.

         一旦类被加载到代码段以后. 直到程序结束的时候才会被释放.

  • [Person new]; 真正在内存中创建对象的其实是这句代码.

                  new做的事情

                  a. 在堆内存中申请1块合适大小的空间.

                  b. 在这个空间中根据类的模板创建对象.

                     类模板中定义了什么属性.就把这些属性依次的声明在对象之中.

                     对象中还有另外1个属性 叫做isa 是1个指针. 指向对象所属的类在代码段中的地址.

                  c. 初始化对象的属性

                     如果属性的类型是基本数据类型 那么就赋值为0

                     如果属性的类型是C语言的指针类型 那么就赋值为NULL

                     如果属性的类型是OC的类指针类型 那么就赋值为nil

                  d. 返回对象的地址.

  • 对象的属性的默认值.

         如果我们创建1个对象,没有为对象的属性赋值. 那么这个对象的属性是有值的.

         如果属性的类型是基本数据类型 默认值是0

         如果属性的类型是C指针类型 那么默认值是NULL

         如果属性的类型是OC指针类型  那么默认值是nil

  • 使用建议.

     虽然使用NULL的地方可以是nil 使用 nil的地方可以使用NULL 但是不建议大家去随便使用.

     C指针用NULL

         int *p1 = NULL; p1指针不指向内存中的任何1块空间.

     OC的类指针用nil

         Person *p1 = nil; p1指针不指向任何对象.

         那么这个时候 如果通过p1指针去访问p1指针指向的对象的属性 这个时候会运行报错.

         那么这个时候,如果通过p1指针去调用对象的方法 运行不会报错 但是方法不会执行 没有任何反应

  • 函数方法调用的方式也不一样.

      函数可以直接调用.

       但是 方法必须要先创建对象 通过对象来调用.

  • 属性不允许声明的时候初始化 

          OC方法必须要创建对象通过对象名来调用 

  • 当对象作为方法的参数传递的时候,是地址传递.

    所以 在方法内部通过形参去修改形参指向的对象的时候 会影响实参变量指向的对象的值.

  • 当A类作为B类的属性的时候. 在创建B类对象的时候, B类对象中的属性仅仅只是1个指针变量. 

 

  • 猜拳游戏:
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Robot.h"
#import "judge.h"

int main(int argc, const char * argv[]) {
    
    Person *p1=[Person new];
    p1->_name=@"灰灰";
    Robot *r1=[Robot new];
    r1->_name=@"小白";
    judge *j1=[judge new];
    j1->_name=@"小黑";
    char ans='y';
    while (ans=='y') {
        [p1 showFist];
        [r1 showFist];
        [j1 winWithPlayer:p1 andRobot:r1];
        NSLog(@"请问是否要继续,y/n");
        //将文件内部的位置指针重新指向一个流(数据流/文件)的开头
        rewind(stdin);
        scanf("%c",&ans);
        while(ans!='y'&&ans!='n') {
            NSLog(@"你输入有误,请重新输入,y/n");
            rewind(stdin);
            scanf("%c",&ans);
        }
        
    }

    return 0;
}

 

#import <Foundation/Foundation.h>
#import "Robot.h"   
#import "Person.h"

@interface judge : NSObject
{
    @public
    NSString *_name;
     
}
-(void)winWithPlayer:(Person *)person andRobot:(Robot *)robot;
@end


#import "judge.h"
#import "Robot.h"

@implementation judge
-(void)winWithPlayer:(Person *)person andRobot:(Robot *)robot
{
    NSLog(@"我是裁判【%@】,我宣布比赛结果",_name);
    int num1=person->_personFistType;
    int num2=robot->_robotFistType;
    if ((num1==1&&num2==3)||(num1==2&&num2==1)||(num1==3&&num2==2)) {
        NSLog(@"恭喜玩家【%@】胜利",person->_name);
        person->_score++;
    }else if(num1==num2){
        NSLog(@"平局哦");
    }else {
        NSLog(@"恭喜电脑【%@】胜利",robot->_name);
        robot->_score++;
    }
    NSLog(@"现在比分【%@】:%d分------机器人【%@】:%d分",person->_name,person->_score,robot->_name,robot->_score);
}
@end

 

#import <Foundation/Foundation.h>

@interface Robot : NSObject
{
    @public
    NSString *_name;
    int _score;
    int _robotFistType;
}
-(void)showFist;
-(NSString *)fistTypeWithNumber:(int)number;
@end


#import "Robot.h"
#import <stdlib.h>

@implementation Robot
-(void)showFist
{
    int robotChoice=arc4random_uniform(3)+1;
    _robotFistType=robotChoice;
    NSString *ChoiceName=[self fistTypeWithNumber:robotChoice];
    NSLog(@"电脑【%@】输入的是%@",_name,ChoiceName);
}
- (NSString *)fistTypeWithNumber:(int)number
{
    if(number  == 1)
    {
        return @"剪刀";
    }
    else if(number == 2)
    {
        return @"石头";
    }
    else
    {
        return @"布";
    }
    
}
@end

 

#import <Foundation/Foundation.h>
#import "FistType.h"

@interface Person : NSObject
{
    @public
    NSString *_name;
    int _score;
    int _personFistType;
}
-(void)showFist;
-(NSString *)fistTypeWithNumber:(int)number;
@end



#import "Person.h"

@implementation Person
-(void)showFist
{
    NSLog(@"亲爱的玩家【%@】,请输入你的拳头:1.剪刀 2.石头 3.布",_name);
    int userChoice=0;
    scanf("%d",&userChoice);
    while (userChoice<1||userChoice>3) {
        NSLog(@"你输入有误,请重新输入");
        rewind(stdin);
        scanf("%d",&userChoice);
    }
    _personFistType=userChoice;
    NSString *ChoiceName=[self fistTypeWithNumber:userChoice];
    NSLog(@"玩家【%@】输入的是%@",_name,ChoiceName);
}
- (NSString *)fistTypeWithNumber:(int)number
{
   
        if(number  == 1)
        {
            return @"剪刀";
        }
        else if(number == 2)
        {
            return @"石头";
        }
        else
        {
            return @"布";
        }
    
}

@end

 

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 0
博文 31
码字总数 24142
×
盘盘的灰灰
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: