博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅谈Objective-C中浅谈面向对象
阅读量:4673 次
发布时间:2019-06-09

本文共 4339 字,大约阅读时间需要 14 分钟。

       学习object-c也有一段时间了,学习期间也遇到很多问题以及很多自己不太理解的地方,通过观看一些课件和博客中一些大牛的文章 也体会到了一些心得体会,今天特

写一些。来表达一下自己的观点和看法 废话不多说了,下面是一些体会  写的不好的地方请大家见谅和指出。

          便利构造器就是对便利初始化函数的间接使用,目的是为了简化对象的初始化(这里是我个人的理解)。便利初始化函数(对象方法)的作用是给实例常量赋初值,在类的实例化后就可以调用便利初始化函数了。而便利构造器是类方法,返回的是对象,在便利构造器中做了两件事:一个是给对象分配空间,第二个是调用便利初始化函数进行数据的初始化。学过设计模式的小伙伴都应该知道“模板方法模式”,我个人感觉便利构造器和模板方法模式的作用挺相似的。

  以下的东西是依附于代码来讲解的,编程吗,即使讲思想也少不了代码不是

  面向对象程序开发的主要目标:用代码模拟现实中的对象,将现实中对象的某些行为能力,特征用代码表现出来,然后用这些代码来模拟现实中的问题。

  每个对象都会从两个角度进行描述,一个是特征,一个是行为能力

            特征:可以是物体的组成部分,也可以是一些物理或逻辑上的属性,用来表现对象的形态,构成及状态。

            行为能力:对象所能被进行的操作或者物体本身发起的操作。用来接受外部操作或对外部进行操作。

    封装:将属性及方法相结合,共同体现对象的特征,称之为封装,封装可以实现隐藏内部实现,稳定外部接口。

   

    在OC中类是由接口(interface)和实现(implementation)两部分构成的。在OC中类是通过两个单独的文件定义。接口定义在对应的头文件中,该文件的作用是说明此类具有哪些属性和方法,但不去实现其行为。

       

        1. OC中接口的定义如下:

#import <Foundation/Foundation.h>

 
@interface Student : NSObject
{
//大括号里定义属性
    
//定义学生的学号,姓名,年龄;
  
    
NSString *studentName;
    
int 
age;
}
 
/*定义学生有关的方法,+修饰的为类方法,不用实例化就可以直接用类访问
* -号修饰的为对象方法,必须实例化后才能使用,就是用对象调用的方法
*/
 
//定义打招呼的方法
- (
void
) sayHello;
//吃饭行为
- (
void
) eat;
@end

代码说明:

            1.#import<Foundation/Foundation.h>语句告诉编译器查看Foundation框架中的Foundation.h的头文件

            2.用#import指令来导入相应的文件,#import的作用相当于PHP中的require_once,如果文件之前导入过了,则不导入,而#include会重复导入文件的

            3.用编译器指令@interface来定义类的声明,@interface后面是类名,Student : NSObject 说明Student继承于NSObject类

            4.在接口中方法只有声明,没有实现,方法前面的减号代表此方法是对象方法,如果是+号的话,说明是类方法,就是说类可以直接访问此方法。

            5.@interface 和 @end是成对出现的,@end代表接口定义的结束

            6.上面得成员变量定义成了公有的,这在开发中是极少见的,这里为了方便练习才这么写的,一般把成员变量定义为私有的然后在定义get,set方法去操作成员变量

      这样才起到了封装,不要把自己的手直接伸入到类中,要通过类提供的方法来操作类的成员变量。

 

 

        2.@implementation 实现部分

            实现部分文件的扩展名为.m,具体实现的方法代码如下:

 
#import "Student.h"
 
@implementation Student
//实现打招呼的行为
- (
void
) sayHello
{
    
NSLog(@
"hello! 我是%@, 我今年%d岁了!"
, studentName, age);
}
 
//实现吃饭行为
- (
void
) eat
{
    
NSLog(@
"%@也得吃饭呢!"
,studentName);
}
 
@end

         代码说明:

                  1.在实现文件中首先导入对应的类的接口文件#import "Student.h",引入系统文件用<FileName>, 引入自定义文件用“FileName”;

                  2.用编译器指令@implementation来声明类方法的实现

                  3.@implementation和@end也是成对出现的

         代码规范:

                1.类名的首字母要大写

                2.方法的命名使用驼峰命名法

 

    3.创建和使用对象

        定义了一个类,一般需要实例化才能使用,当然静态类是不需要实例化就能用的。对象是类的实体,类是对象的抽象,因此需要对类进行实例化。

        实例化的代码如下:

 
#import <Foundation/Foundation.h>
 
//引入定义的类
#import "Student.h"
 
int 
main(
int 
argc, 
const 
char 
* argv[])
{
 
    
@autoreleasepool {
        
//创建对象,完成对象的声明,内存分配,初始化
        
Student *student = [[Student alloc] init];
         
        
//为了方便,在这就直接给成员变量赋值,前提是成员变量是公有的
        
student->studentName = @
"ludashi"
;
        
student->age = 20;
        
student->hobby=@
"爱咋咋地"
;
         
        
//调用成员方法
        
[student sayHello];
        
[student eat];
         
    
}
    
return 
0;
}

        

    ​    ​  代码说明:

    ​    ​    ​    ​1.要在一个类中实例化类,首先要引入类的接口定义文件如上面的 #import “Student.h”;

    ​    ​    ​    ​2.OC中类的实例化方式是 Student  *student =  [[Student alloc] init], 可以理解为Student类在NSObject类中继承了alloc方法, alloc这个方法是用来

       实例化对象的 ​init 是默认的构造方法

    ​    ​    ​    ​3.在OC中对象调用其中的方法是通过[]来实现的,[对象名   方法名];

    ​    ​  定义对象的语法:

    ​    ​    ​    ​类名    ​*对象名 = [  [ 类名 alloc ] init ];   或者

    ​    ​    ​    ​类名    ​*对象名 = [ 类名  new];

             上面的两种方法相同

    ​    ​  给对象的成员变量赋值和调用对象的方法如下:

    ​    ​    ​    ​对象名->成员变量名 = 具体值;

    ​    ​    ​    ​[ 对象名 方法名];

 

    ​一:类方法和对象方法

    ​    ​上面也提到了,减号开头的方法为对象方法,需要实例化类后通过对象来进行调用。对象方法允许调用对象方法和对象变量​加号开头的方法为类方法,通过类就可以直接调用的方法。

    ​    ​下面是一些方法调用的一些规则:

    ​    ​    ​    ​1.类方法可以调用类方法;

    ​    ​    ​    ​2.类方法不可以调用对象方法;

    ​    ​    ​    ​3.类方法不可以使用对象变量,类方法可以使用self(self相当于java中的this);    ​    ​    ​

    ​    ​    ​    ​4.可以通过类来调用类方法,但对象不可以调用类方法

    ​    ​

    ​    ​1.对象的初始化

    ​    ​    ​    ​可以重写父类中的方法init来进行对象的初始化,就相当于Java中的构造函数,重写代码如下:

 
//重写init方法,为本类添加构造方法
-(id) init
{
    
if 
(self =[super init])
    
{
        
studentName = @
"dashi"
;
        
age = 18;
        
hobby = @
"hehe"
;
    
}
    
return 
self;
}

    ​    ​    ​ 代码说明:

    ​    ​    ​    ​    ​1.因为init是继承过来的方法因此不需要在interface里面声明,直接在implementation中进行重写就OK了;

    ​    ​    ​    ​    ​2. init的返回类型为id, id是OC中的一切父类.在面向对象中父类可以声明子类的变量

    ​    ​    ​    ​    ​3.[super init]是为了初始化父类的成员变量,返回值为子类对象,如果返回nil,说明父类没有alloc成功,即不能在alloc子类对象。

 

    ​    ​2.便利初始化函数

    ​    ​    ​自定义的便利初始化函数的作用是让用户自己初始化用户所实例化的对象,便利初始化函数以init开头,我们可以在类中自定义便利初始化函数。因为便利初始化函数是自  己。  ​定义的所以需要在@interface中进行声明,便利初始化函数可以进行重载

    ​    ​    ​在@implementation中进行重新的代码如下:

 
 
//实现便利初始化方法1
- (id) initWithName:(NSString *)sName iAge:(
int
)anAge
{
    
if 
(self = [super init]) {
        
studentName = [sName copy];
        
age = anAge;
    
}
    
return 
self;
}
 
//实现便利初始化方法2
- (id) initWithName:(NSString *)sName
{
    
if 
(self = [super init]) {
        
studentName = [sName copy];
    
}
    
return 
self;
}

    ​    ​  代码说明:

    ​    ​    ​    ​1.函数名后面的冒号跟的是参数列表,在OC中定义参数的方式是: (参数类型)参数名    第二个参数别名:(参数类型)参数名   

    ​    ​   

    ​    ​使用便利初始化方法来进行对象的初始化,代码如下:

 
//调用便利初始化方法
Student *s1 = [[Student alloc] initWithName:@
"dashi1" 
iAge:19];
[s1 sayHello];

 

 

    ​3.便利构造器

        ​上面用便利初始化方法在类实例化时有些繁琐,为了简化实例化的操作,自定义一个类方法,类方法的作用是进行类的实例化同时进行参数的初始化,并返回对象

    ​    ​便利构造器的实现代码如下:

 
//实现便利构造器,进行类的实例化并调用initWithName
+ (id) studentWithName:(NSString *)name age:(
int
)sAge
{
    
Student *student = [[Student alloc] initWithName:name iAge:sAge];
    
return 
student;
}

    ​

    ​    ​便利构造器的使用如下:

1
2
//调用便利构造器初始化对象
Student *s2 = [Student studentWithName:@
"dashi2" 
age:20];

​ ​    ​    ​  

转载于:https://www.cnblogs.com/bug123/p/5222167.html

你可能感兴趣的文章