OC基础知识(二)

 

1、Objective-C类和对象

Objective-C 简称OC。

OC是c语言的超集,简单来说就是,OC全面包容C语言,也就是在OC中,可以使用C语言代码,编译器可以兼容C语言,并对其进行编译,执行。

1、面向过程po:Procedure Oriented

面向过程,就是在一个整体思路定好的情况下,按照这个思路一直走下去,这种情况的代码,就会比较稳定。但是,这种面向过程的思想,会比较坑爹,为什么这么说?因为,当需求改变的时候,也就是逻辑中,有一个步骤改变的话,就会改动整个程序,相当于重新写了一遍程序。导致程序的重用性不高。

区别:分析解决问题的步骤,实现函数,依次调用函数

2、面向对象OOP:Object Oriented Programming

面向对象,其实就是在编码前,把具有相同特征和行为的东西抽出来,组成一个类型,这些类型,在没有使用的时候,没有半点关系,一直到使用的时候,才会将这些类型相互作用。这种方式,在需求改变时,也就是逻辑改变时,不需要将整个程序重写,只需要将改动的那个类抽出来,改成我们需要的即可。这种面向对象的编程编译的时候,是我看一句,我就告诉你这一句的意思,按照我有什么,我就写什么的思想进行编写的。面向对象不比面向过程稳定,但是比面向过程灵活,多样。

区别:分析某问题需要参与的对象,各个对象的作⽤,多个对象协作完成任务。

面向对象,离不开面向过程。因为在面向对象中,把同类型的东西拿出来之后,按照思路进行编写的时候,也是面向过程。

面向对象有三大特征:继承、封装、多态。

3、类和对象:

类是具有相同特征和行为的事物的抽象。

对象是一个类的具体实现。

类和对象的关系:

类是对象的类型(与int、float类似),可以这么说,我的奥迪A6(对象),的类型是汽车(类型)。

对象是类的实例,也就是说,汽车里(类型)有一辆车是我的奥迪A6(对象)。

OC中类的定义:

在开发的时候,先定义一个类型,类。然后才能创建对象。

OC中,定义类的时候,分成两个文件:.h接口文件,.m实现文件。

.h接口文件,用来声明类的特征和行为。

.m实现文件,用来实现.h文件里声明的特征和行为。

 

解释.h文件和.m文件:

.h文件里,接口部分,用@interface…….@end来标识,在这期间,声明类的实例变量和方法,即特征和行为。.h文件,包含了类名、父类名、实例变量、方法。

// 2015-04-13 11:19:28 北京

 

//引入框架

#import <Foundation/Foundation.h>

 

//我们创建的类,只是一种类型,用这种类型创建出对象。

//.h 文件代表接口,类似于说明书,里边有我们的 实例变量 和 方法声明。

//.m 文件,目前 只有方法实现。

//接口 类名 :类名

@interface Person : NSObject{

   

    //写特征的

    //这些特征,有一个名字叫做实例变量

    //规范:在实例变量名前加下划线 _

    //可见度

    @public

    NSString *_name;

    NSInteger _age;

    NSString *_sex;

}

//这里写的行为,都是声明的。

//我们叫这些行为叫做方法,(理解为C语言中的函数)

//无参无返回值

-(void) sayHi;

//结束接口

@end

解释:

1、#import <Foundation/Foundation.h>,在每一个声明文件开始时,都要引入这个类库。

2、@interface Person: NSObject,@interface是接口开始的标识,其后直接跟我们定义的类的类名,:NSObject表示继承了NSObject这个基类。

3、@public这个表示实例变量的可见度,可见度可分为@private,@protected等。

4、    NSString *_name;

       NSInteger _age;

      NSString *_sex;

表示Student类有三个实例变量。_name和_sex是字符串类型的,_age是整型的。在OC中,用了nextStep这个语言的前缀NS来标记各种类型。在oc中基本类型来定义实例变量,不用加* 号,不是基本类型的才用加上 * 号。NSString是字符串类型,不是基本类型,NSIteger是基本数据类型,不用加 * 号。

命名规范,OC中规定了在实例变量前加上下划线 _ 。

5、-(void)sayHi; - 号表示,这个是一个实例方法,写在{ }外面。这个方法的方法名是sayHi,返回值是void型的。

6、@end,表示接口的结束

 

.m文件里,用来实现.h文件声明的方法以及可以对实例变量进行初始化赋值,即重写init方法。

 

//引入了Person头文件

#import "Person.h"

 

//实现 类名

@implementation Person

//这里所说的实现,是实现方法

-(void) sayHi{

   

    NSLog(@"大家好。");

}

//重写init方法

//instancetype:任意的对象类型

-(instancetype)init{

   

    //赋初值(一旦创建出来的对象,就有这些值)

   

    //在类内使用实例变量,直接使用实例变量的名字即可。

    _name = @"大白";

    _age = 19;

    _sex = @"男";             

   

    //self表示自己。

    //self其实就是一个指针,指向自己。

    //必须返回self

    //这个初始化方法不完整,所以看不出它的作用。

    return self;

}

 

解释:

1、#import "Person.h",在实现文件里的第一件事,就是将这个类的头文件引过来。只有这样,才是在写实现方法时,用到类的时候,识别这个类是什么。

2、@implementation Person,@implementation 表示实现的开始,后面跟着

Person(类名),表示我要实现Person类。

3、-(void) sayHi{   

    NSLog(@"大家好。");

}

这里是在.h文件中声明的方法,我们在这里实现,- 号表示这是一个实例方法,方法明为sayHi,返回值是void。NSLog(@"大家好。");与C语言的printf方法一样。OC中,在每一个字符串前,都要加上@。如@”呵呵”。

4、-(instancetype)init{   

    //在累内使用实例变量,直接使用实例变量的名字即可。

    _name = @"大白";

    _age = 19;

    _sex = @"男";

    //self表示自己。

    //self其实就是一个指针,指向自己。

    //必须返回self

    //这个初始化方法不完整,所以看不出它的作用。

    return self;

}

这是一个实例方法,是我们重写init初始化方法的一个例子。- 号表示是实例方法,方法明是init,返回值是instancetype,即任意类型的指针。在类里边的实例变量可以直接使用变量名进行赋值(即为初始化成我们想要的值)。return self的意思是返回自己。它自己就是一个指针。在内存中,我的init方法地址指向的是它自己的首地址,self是后面存在的,在返回self时,这个self和函数名一样指向同一个地方。

 

创建对象:

在main.m文件中,我们对创建好的类进行实例化,对其创建一个对象。这样说,其实是与int a = 10;是一样的,我们创建的类,相当于int类型,我们创建的实例对象,相当于a。

创建对象的方式:

1、

Person *p = [Person alloc]这一步是分配内存。为类方法

p = [p init];这一步是进行实例化。为实例方法

OC中,[]表示调用方法,形式为[类名 方法名]。方法分为两种

(1)、类方法:与实例方法相反,用 + 号在前标识 。+(id)alloc;

(2)、实例方法:用 – 号在前标识。-(void)sayHi{}

2、Person *p = [[Person alloc]init];分配内存后直接初始化。

 

 

#import <Foundation/Foundation.h>

 

//写好一个类,要使用的时候,首先记得引入

#import "Person.h"

#import "Student.h"

int main(int argc, const char * argv[])

{

    //2015-04-13 11:05:18 北京

   

    //内存管理,能够帮助我们释放内存。

    @autoreleasepool {

    

        //类类型,加 * 号。

       

       

        //字符串

        //nextStep 简称NS,看到NS前缀的,都是OC里边用的。

        //@:cocoa的一个符号。字符串前都要加上@符。

        NSString *str1 = @"大白";

       

        //基本数据类型。不加 * 号的。

        //整型

        NSInteger num1 = 10;

       

        //float

       

        CGFloat f1 = 1.2;

       

       

        //所有的对象(类创建出来的)都用%@占位符

        NSLog(@"%@",str1);//2015-04-13 11:13:04.208 OCLesson1_类和对象[933:38999] 大白

       

        //创建一个Person对象

        //1.

        //分配内存

        Person *p1  = [Person alloc];//类方法

        //初始化

        p1 = [p1 init];//实例方法

       

        //2.

        //先分配了内存,然后初始化。

        Person *p2 = [[Person alloc] init];

       

        //1、+ 表示类方法

        //OC中使用类方法:[类名 方法名]

       

       

        //2、- 表示实例方法

       

        //OC中使用实例方法,要用[对象 方法名]。

        [p2 sayHi];//2015-04-13 15:15:08.788 OCLesson1_类和对象[1858:97196] 大家好。

    }

    return 0;

}

调用方法:

形式为[对象名 方法名]。

 

使用对象:

OC中使用对象的方式:

对象名—>实例变量名。与结构体指针,有点类似。

 

        Person *pn = [[Person alloc] init];

        //使用实例变量:对象名 ->实例变量名。

       

        NSLog(@"%@",pn->_name);//2015-04-13 15:25:44.140 OCLesson1_类和对象[1902:100456] (null)

        //给 _name 赋值

        pn->_name = @"小金刚";

        NSLog(@"%@",pn->_name);//2015-04-13 15:25:44.141 OCLesson1_类和对象[1902:100456] 小金刚

       

        pn->_age = 20;

        pn->_sex = @"妹子";

       

        NSLog(@"%ld",pn->_age);

        NSLog(@"%@",pn->_sex);

 

 

 

 

一个例子:

创建一个student对象,给他的实例变量赋值,并且打印出来。

Student.h文件

 

#import <Foundation/Foundation.h>

 

@interface Student : NSObject{

    @public

    NSString *_name;

    NSInteger _age;

}

 

-(void)sayHi;

 

@end

Student.m文件

#import "Student.h"

 

@implementation Student

 

-(void)sayHi{

   

    NSLog(@"好好学习,天天向上...");

}

 

//重写init方法

-(instancetype)init{

    _name = @"摩托罗拉";

    _age = 20;

    return self;

}

 

@end

main.m文件

 

#import <Foundation/Foundation.h>

 

//写好一个类,要使用的时候,首先记得引入

#import "Person.h"

#import "Student.h"

 

 

int main(int argc, const char * argv[])

{

//        //创建一个student对象,给他的实例变量赋值,并且打印出来。

//        Student *stu = [[Student alloc] init];

//        stu->_name = @"阴天";

//        stu->_age = 19;

//        NSLog(@"%@",stu->_name);//2015-04-13 15:36:09.471 OCLesson1_类和对象[1941:103393] 阴天

//        NSLog(@"%ld",stu->_age);//2015-04-13 15:36:09.472 OCLesson1_类和对象[1941:103393] 19

       

//        Person *p5 = [[Person alloc] init];

//        NSLog(@"%@",p5->_name);//2015-04-13 15:57:37.197 OCLesson1_类和对象[2018:108183] 大白

//        NSLog(@"%@",p5->_sex);//2015-04-13 15:57:37.198 OCLesson1_类和对象[2018:108183] 男

//        NSLog(@"%ld",p5->_age);//2015-04-13 15:57:37.198 OCLesson1_类和对象[2018:108183] 19

       

       

        Student *stu = [[Student alloc]init];

       

        NSLog(@"%@",stu->_name);//2015-04-13 16:15:57.148 OCLesson1_类和对象[2084:114560] 摩托罗拉

        NSLog(@"%ld",stu->_age);//2015-04-13 16:15:57.149 OCLesson1_类和对象[2084:114560] 20

       

    }

    return 0;

}

一个练习:

将大象装进冰箱分几步?三步:打开冰箱门,把大象装进去,关上冰箱门。

Elephant.h文件

#import <Foundation/Foundation.h>

 

@interface Elephant : NSObject{

    @public

   

    NSString *_name;

    NSString *_color;

}

//装入

-(void)incase;

@end

 

 

Elephant.m文件

#import "Elephant.h"

 

@implementation Elephant

 

- (instancetype)init{

    _name = @"艾莉芬特";

    _color = @"土豪金";

    return self;

}

-(void)incase{

    NSLog(@"靠,谁把老子装冰箱里了...👍");

}

@end

IceBox.h文件

#import <Foundation/Foundation.h>

 

@interface IceBox : NSObject{

    @public

    NSString *_brand;

}

- (void)open;

- (void)closed;

@end

 

IceBox.m文件

#import "IceBox.h"

 

@implementation IceBox

 

- (instancetype)init{

    _brand = @"西门庆";

    return self;

}

- (void)open{

    NSLog(@"冰箱门打开...");

}

- (void)closed{

    NSLog(@"冰箱门关上了...");

}

 

@end

main.m文件

#import <Foundation/Foundation.h>

#import "Elephant.h"

#import "IceBox.h"

 

int main(int argc, const char * argv[])

{

 

    @autoreleasepool {

       

        //创建大象对象

        Elephant *el = [[Elephant alloc] init];

        //创建冰箱对象

        IceBox *icb = [[IceBox alloc] init];

       

        NSLog(@"大家好,我是%@,我是%@颜色..",el->_name,el->_color);

        NSLog(@"大家好,我是 %@ 冰箱..",icb->_brand);

        //面向对象三大特性:封装,继承,多态

        //封装,屏蔽内部细节,让别人只看.h文件,就知道怎么用了。

        //这里的方法调用,体现了封装。

        [icb open];

        [el incase];

        [icb closed];

    }

    return 0;

}

这个例子特别注意就是如何屏蔽内部细节代码,让别人只看到.h文件东西,不能看到.m文件的代码,这样保护自己的代码。

posted @ 2016-01-10 08:52  恒远也  阅读(230)  评论(0编辑  收藏  举报