您的位置:首页 > 移动开发 > Objective-C

Objective-C类和对象

2015-07-31 21:52 309 查看
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 =
@"<
da37
span style="color:#A31515;">大白";
    _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;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  iOS oc