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没有自带换行,必须手动加\n。
 
    内容区别:
        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方法都会开辟堆空间,换句话说就是一个新的对象。
 
*/

 

posted @ 2015-11-16 17:49  祁临芯  阅读(880)  评论(0编辑  收藏  举报
友情链接:初心商城