zoukankan      html  css  js  c++  java
  • oc语言学习之基础知识点介绍(一):OC介绍

     

    一、第一个OC程序

    #import <Foundation/Foundation.h> //导入头文件
    
    int main(int argc, const char * argv[]) { //main函数
        
        @autoreleasepool {//自动释放池,我们现在写代码最好都写这里面
            
            NSLog(@"Hello, World!"); //输出语句
        }
        
        return 0; //退出程序,返回一个值给系统看
    }

    二、OC中的字符串

    /*
     前缀的概念:(了解一下)
     提供框架的作者很多,所以方法名或者可能重复,推荐官方的框架用2个字母开头,第三方的用三个。
     
    c语言中没有字符串这个类型,只能用char类型的指针或者数组。无论如何,C语言都没有专门为字符串创建一个类型。
    
    OC中的字符串类型:
     NSString类型
        它就是OC中的字符串类型!
    
     NSString类型也是
     
        NSString *str = @"哈哈哈";
     
     OC中字符串是:@"字符串"
     
            都是以@符号开头的
     
     @"字符串"方便我们区分是OC字符串
     
     OC字符串类型不能赋值为C语言字符串
     
            NSString *str = "哈哈哈";
    */
    
    #import <Foundation/Foundation.h>
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            NSString *str = @"哈哈哈";
            NSLog(@"Hello, World!");
        }
        return 0;
    }

    三、NSLog

    /*
     
     NSLog:
            输出一句话
     
     printf("格式化控制符",值列表);
     
     NSLog,也可以加格式化控制符!
     
     C语言格式化控制符
     %d:输出int类型
     %f:输出float类型
     %c:输出char类型
     %s:输出C语言字符串
     %ld:输出long类型
     %lu:输出unsigned long类型
     …………:
     
     NSLog完全可以输出以上的格式化控制符。
     
     还增加了
     
     %@:输出对象类型!(OC中的字符串也是一个对象),注意不能输出C语言字符串。
     
     NSLog与printf的区别:
        换行区别:
            NSLog自带换行。
            printf没有自带换行,必须手动加
    。
     
        内容区别:
            NSLog默认打印出项目名字和打印的时间。
            printf木有。
     
        输出内容区别:
            NSLog可以输出%@(NSLog可以输出C语言中的所有格式化控制符,但是自己还新增了一些)。
            printf不可以输出%@
    
        注意:
            NSLog可以打印%s,可以!但是有条件!不能打印包含带有中文(中文符号也不行)的C语言字符串。
    */
    
    #import <Foundation/Foundation.h>
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            
            NSLog(@"%@",@"dsadsa¥");
          
        }
        return 0;
    }

    四、OC和C的比较

    /*
     
     C和OC的对比:
     
        文件对比:
                       C    OC
                头文件:.h   .h
                源文件:.c   .m
                目标文件:.o  .o
     
        数据类型:
                C:基本类型、数组、结构体、枚举等等
     
                OC:除了C语言的类型外,还有自己的类型,NSString
                    换句话说,OC有C语言的所有类型 int double 数组 结构体 在OC中也统统能用。
                还增加了BOOL类型,YES  Or NO,也有,true Or false。但是推荐
                        用YES  Or   NO,
                 C语言中怎么表示真和假?0为假,非0为真。
    
        变量常量:简而言之也是C语言中的变量和常量的概念在OC中通用
     
        分支语句:
     
                C和OC中的分支语句完全,也就是说if和switch语句都能在OC中用
     
        循环语句:
                OC中可以用C所有的循环语句(while,do-while,for)
     
                但是OC还多了一种增强型的for语句
     
        函数:
            OC中完全可以用函数,概念一样,OC中多了方法的概念
    
        结构体、指针、枚举:
                统统都可以用在OC中
     
        OC增加了类的类型,和类的对象
     
     总结:OC中可以用所有C语言中的东西,只不过又新增了一些自己的东西
     
    */
    
    #import <Foundation/Foundation.h>
    
    typedef struct {
        
        char str[50];
        int age;
    }Person;
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            
            //OC中的数组
            NSArray *arr = @[ @"老周",@"真的",@"very帅" ];
            
            //C语言的for
    //        for (int i =0; i<3;i++ ) {
    //            
    //            NSLog(@"%@",arr[i]);
    //        }
            
            //OC中增强型的for
            for (NSString* str in arr) {
                
                NSLog(@"%@",str);
            }
            
        }
        return 0;
    }

    五、面向对象、类和对象的概念

        1、面向对象

    /*
            面向对象只是一种解决问题的思维而已。
            面向对象只是一种思维方式的改变,而并不是语法的创新。
            一切事物皆对象,通过面向对象的方式,将现实世界的事物抽象成对象,现实世界中的关系抽象成类、继承,帮助人们实现对现实世界的抽象与数字建模。
            通过面向对象的方法,更利于用人理解的方式对复杂系统进行分析、设计与编程。同时,面向对象能有效提高编程的效率,通过封装技术,消息机制可以像搭积木的一样快速开发出一个全新的系统。
            面向对象是指一种程序设计范型,同时也是一种程序开发的方法。对象指的是类的集合。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。
    */

        2、类和对象

    /*
    对象:
            对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。
    对象的状态和行为:
            对象具有状态,一个对象用数据值来描述它的状态。
            对象还有操作,用于改变对象的状态,对象及其操作就是对象的行为。
            对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中[2] 
    类:
            具有相同特性(数据元素)和行为(功能)的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象,类实际上就是一种数据类型。
            类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。
            类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。
    类的结构:
            在客观世界中有若干类,这些类之间有一定的结构关系。通常有两种主要的结构关系,即一般--具体结构关系,整体--部分结构关系。
    ①一般--具体结构称为分类结构,也可以说是“或”关系,或者是“is a”关系。
    ②整体--部分结构称为组装结构,它们之间的关系是一种“与”关系,或者是“has a”关系。
    ⑸消息和方法。
    对象之间进行通信的结构叫做消息。在对象的操作中,当一个消息发送给某个对象时,消息包含接收对象去执行某种操作的信息。发送一条消息至少要包括说明接受消息的对象名、发送给该对象的消息名(即对象名、方法名)。一般还要对参数加以说明,参数可以是认识该消息的对象所知道的变量名,或者是所有对象都知道的全局变量名。
    类中操作的实现过程叫做方法,一个方法有方法名、返回值、参数、方法体。
    */

        3、代码实现

    /*
        声明类的语法:
     
                    @interface 类名 : NSObject{
                        @public
                        属性列表
                    }
     
                    行为列表
     
                    @end
     
        注意:@end不可省略,否则报错!
                    暂时一定要加一个@public
     行为在代码里面又叫方法
     
        语法:-(void)方法名;
    
     注意:还要加@implementation 类名 + @end
     
     否则要报错
     
        语法:
            @implementation 类名
     
            方法的实现列表
     
            @end
     
     注意:1.类名每个单词首字母都要大写
          2.属性以_开头,属性又叫成员变量
          3.@implementation 和@end一定不能少
     
     用代表表示对象:
     
            语法:
                类名 *对象名 = [类名 new];
     
                对象名->属性名 = 值;
     
                还有一种方法 (*对象名).属性名 = 值;  (不推荐用)
    
    */
    
    #import <Foundation/Foundation.h>
    
    @interface Teacher:NSObject{
    
        @public
        
        NSString *_name; //姓名
        
        int _age; //年龄
        
        BOOL _gender; //性别,YES-男  NO-女
        
        NSString *_subject; //学科
        
        int _salary; //工资
    }
    
    //行为
    -(void)teaching;
    
    @end
    
    @implementation Teacher
    
    -(void)teaching{
        
        NSLog(@"开始让你们涨姿势");
    }
    
    @end
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            
            //这就是Teacher类的对象
            Teacher *tea= [Teacher new];
            
            tea->_age = 16;
            
            tea->_name = @"哈哈哈";
            
            tea->_gender = YES;
            
            tea->_salary = 1;
            
            tea->_subject = @"学科";
            
            NSLog(@"姓名:%@  年龄:%d",tea->_name,tea->_age);
            
        }
        return 0;
    }

        4、方法的几种用法

              1)、无参无返回值

    /*
     
     一个类的三要素:
            类名、属性、行为(方法)
     
    代码里面写的方法,其实就是对某一个类进行行为的描述。
     
     方法的定义:
            -(void)方法名;
     
     方法的实现:
            -(void)方法名{
                方法体;
            }
    
    方法它本质上就是函数,方法很多的用法跟函数一样。
     
    函数分为无参无返回值的函数、有参无返回值的函数、有参有返回值的函数、无参有返回值的函数,方法也分这几种。
     
     无参无返回值的函数:
            void  函数名();
     
    方法的: -(void)方法名;
    
    调用:
        函数用法:
             函数名();
    
        方法用法:
             [对象名 方法名];
     
     注意:1.方法的声明只能写在@interface和@end之间(不包括大括号里面)
           2.方法的实现只能写在@implementation和@end之间
    */
    
    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject{
        @public //不加public外面调用不了
        NSString *_name;
        int _age;
    }
    -(void)run;
    
    @end
    
    @implementation Person
    
    -(void)run{
        NSLog(@"打印了哟");
    }
    @end
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            //调用方法之前一定要new一个对象
            Person *p = [Person new];
            [p run];//对象名 方法名
        }
        return 0;
    }

              2)、 有参无返回值

    /*
     
     一个参数的情况:
     
        定义:
                -(void)方法名:(参数类型)参数名;
     
        实现:
                -(void)方法名:(参数类型)参数名{
                     方法体;
                }
     
        调用:
                [对象名  方法名:实参值];
        注意:如果有参数的话,冒号也属于方法名。
     
     两个参数的情况:
            定义:
                    -(void)方法名:(参数类型)参数名 :(参数类型)参数名2;
    
            注意:1、有空格!
                 2、为了增强方法的可读性,一般在后面的参数里面,还会写一些方法的名(必须加)。
                  例: -(void)方法名1:(参数类型)参数名 方法名2:(参数类型)参数名2;
            实现:
                    -(void)方法名:(参数类型)参数名 :(参数类型)参数名2{
                        方法体;
                    }
     
            调用:
                [对象名  方法:参数1 :参数2];
     
     
     N个参数的情况:
     
                -(void)方法名:(参数类型)参数名1 方法名2:(参数类型)参数名2 方法名3:(参数类型)参数名3 方法名n:(参数类型)参数名n;
    
     注意:方法名是包含冒号的!
     
    */
    
    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject{
        NSString *_name;
        int age;
    }
    
    /**
     *  方法名:watchMovie:andFood:
     *
     */
    -(void)watchMovie:(NSString *)movie andFood:(NSString *)food;
    
    -(void)watchMovie:(NSString *)movie :(NSString *)food;
    
    /**
     *  方法名是eat:    形参名是:food
     */
    -(void)eat:(NSString *)food;
    
    @end
    
    @implementation Person
    
    //方法的实现
    -(void)eat:(NSString *)food{
        NSLog(@"吃%@",food);
    }
    
    
    -(void)watchMovie:(NSString *)movie andFood:(NSString *)food{
    
        NSLog(@"看《%@》,吃着%@",movie,food);
    }
    
    @end
    
    //方法名:rangeOfCharacterFromSet:options:
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            
            Person *p = [Person new];
            
    //        NSString *food = @"汉堡包";
    //        
    //        [p eat:food]; //传递变量
            
            [p eat:@"汉堡包"]; //可以直接给值
            
             [p watchMovie:@"咒怨" :@"瓜子" ];
    
            [p watchMovie:@"咒怨" andFood:@"瓜子" ];
        }
        return 0;
    }

              3)、 有返回值

    /*
     有返回值方法的定义:
            -(返回值类型)方法名:参数列表;
           例: -(int)sayAge;
    
     实现:
            -(返回值类型)方法名:参数列表{
                方法体;
                return 值;
            }
    
            -(int)sayAge{
                return 16;
            }
    
     方法的返回值跟函数一样,你可以接收,也可以不接收,反正它都会执行
     
    */
    
    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject{
    
        @public
        NSString *_name;
        int _age;
    }
    
    -(int)sayAge;
    
    @end
    
    @implementation Person
    
    -(int)sayAge{
        
        return 16;
    }
    
    @end
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            Person *p = [Person new];        
    //        int age = [p sayAge];
    //        NSLog(@"%d",age);
            NSLog(@"%d",[p sayAge]);
        }
        return 0;
    }

        5、方法中操作属性 

    /*
     
     在方法里面可以给属性赋值或者取值。
     
     方法里面可以给属性赋值和取值
     
        语法:
            取值:
                属性名;
     
            赋值:
                属性名 = 值;
    */
    
    #import <Foundation/Foundation.h>
    
    @interface Person: NSObject{
        
        @public
        NSString *_name;
        int _age;
    }
    
    /**
     *  打招呼方法
     */
    -(void)sayHi;
    
    @end
    
    @implementation Person
    
    -(void)sayHi{
        _age = 54; //改动的是同一个对象
        //直接在方法里面使用属性名就能访问到
        NSLog(@"我叫%@,今年%d岁",_name,_age);
    }
    
    @end
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            
            Person *p = [Person new];
            
            p->_name = @"李刚";
            
            p->_age = 44;
            
            [p sayHi];//54岁
            
            NSLog(@"age=%d",p->_age);//54
            
        }
        return 0;
    }

          6、new关键字做的三件事

    /*
     
     nil代表空,也就是数字0
     new关键字做了三件事:
     
        1.开辟堆空间
     
        2.初始化对象(初始化里面的属性,默认初始化为0)
     
        3.返回堆空间的地址
     
     只要遇到调用了new方法都会开辟堆空间,换句话说就是一个新的对象。
     
    */
  • 相关阅读:
    接口测试 API测试
    接口测试 JMeter 开坑
    【测试笔记】集成测试 自顶向下 自底向上
    白盒测试 各类覆盖方法辨析
    eureka 管理界面打不开
    Spring Boot 2.0 Admin
    spring swagger2配置
    解决 Registered driver with driverClassName=oracle.jdbc.driver.OracleDriver was not found, trying direct instantiation.
    springboot+mybatis在插入空值时报错的问题
    Vue Cli 3代理配置
  • 原文地址:https://www.cnblogs.com/bobo-pcb/p/4969318.html
Copyright © 2011-2022 走看看