Objective-C面向对象

  1. 主要为Objective-c的基础语法的学习
  2. 之前有Java基础,所以只记录了一些重点
  3. 错误之处,敬请留言

1. 与面向过程之间的区别

  1. 面相过程的解决方式是分析问题的步骤,然后每个步骤用分别的函数来解决。将问题分解为不同的步骤,然后一步一步往下走。
  2. 面向对象的解决方式是将他们划分为若干的功能,而不是步骤。将其根绝不同的功能划分为不同的子模块。

2. 类与对象

  1. 类是对同一类事物高度的抽象,类中定义了这一类对象应具有静态属性(属性)和动态属性(方法);
  2. 对象是类的一个实例;
  3. 类与对象是抽象与具体的关系;
  4. 类其实就是一种数据类型,它的变量就是对象。
  5. 满足继承关系,也就是A若是B,表明这个时候就可以堪称是继承关系。

3. 多态

  1. 对象是oc程序的核心,“万事万物皆对象”是程序中的核心思想。
  2. 累屎用来创建同一类型的对象的“模版”,在一个类中定义了该类对象所具有的成员变量以及方法。
  3. 类可以堪称是静态属性和动态属性的结合体。
  4. IOS SDK里面提供了大量供编程人员使用的类,编程人员也可以定义自己的类。

4. 类的声明

  1. 声明的格式,用@interface来声明一个类,冒号表示继承关系,冒号后面是类的父类。NSObject是所有类的父类。@end关键字结束。

    @interface Person: NSObject	// : 表示继承关系
    {
    	// 实例变量声明
    	int identify;
    	int age;
    }
    // 方法声明,参数是
    - (id) initWithAge: (int) _age identify: (int) _identify;
    - (int) getIdentify;
    - (int) getAge;
    - (void) setAge:(int) _age;
    @end
    
  2. 类的声明放在类名 + .h文件中,例如Person.h文件。

  3. 类的声明主要由两部分组成:实例变量和方法,声明实例变量的格式:变量类型、变量的名称,例如:int age;

  4. oc中的方法,是一段用来完成特定功能代码片段,"-“表示实例方法,”+"表示类方法,实参的数目、数据类型和顺序必须和所调用的方法声明的形参列表匹配。

  5. 基本数据类型传递的是该数据值的本身,指针类型传递的是对象的指针,而不是对象本身。

5. 方法调用

  1. 采用特定的语言调用类或者实例(对象)的方法称为发送消息或方法调用,其调用的方法有两种,一种是[类名或对象名 方法名]对象名.方法名
  2. 一个实例或者类本身需要传入多个参数
  3. 嵌套发送消息[[ClassOrInstance method:arg1] otherMethod];

6. 指针

  1. 除了基本数据类型之外的变量类型都称为指针类型,Objective-c的对象就是通过指针对其操作的。

    // 声明了一个NSString类型的指针变量,但是它并没有志向任何一个对象
    NSString *s;
    // 使用alloc放啊创建了一个NSString,类型的对象并用s指向它,以后可以通过s完成对其操作
    s = [[NSString alloc] initWithString: @"Hello iPhone"];
    
  2. OC中的对象通过指针来声明,例如:ClassA *Object;

  3. OC中对象的创建,使用alloc来创建一个对象。编辑器会给object对象分配一块可用的内存地址,然后需要对对象进行初始化即调用init方法,这样这个对象才可以使用

    Person *person = [Person alloc];
    person = [person init];
    
  4. 同一类的每个对象有不同的实例变量的储存空间。同一类的每个对象共享该类方法,方法嵌套的形式来调用,例如:ClassA *object = [[ClassA alloc] init];

7. 对象初始化

  1. 对象必须先创建,然后初始化,才能使用,NSObject *object = [[NSObject alloc] init];

  2. 首先为对象分配内存地址,为初始化做准备。初始化是对象创建过程中将新分配对象的状态设置为合理的初始值、使之处于可用状态的阶段。通过约定,雾霾要求出示方法以init开头,并且在成功完成初始化后,返回一个动态类型对象(id),如果失败则返回nil,出示方法可以包含一个或者多个参数用于指定初始值。

    - (id)initWithArgument:(int)arg;
    - (id)initWithArgument1:(int)arg1 xxWithArgument2:(int)arg2;
    
  3. 在init方法中,若要富勒完成所需一次性的初始化,需要调用[super init],init方法返回的值(id型数据),描述了被初始化的对象。将[super init]的结果赋值给self是Objective-C的标准惯例,这么做是为了防止父类在初始化过程中返回的对象不同于原先创建的对象。

    - (id) init 
    {
    	self = [super init];
    	if (self) {
    		// init code
    	}
    	return self;
    }
    
  4. 指定初始化方法,具有最完整的初始化参数的初始化方法通常就是执行的初始化方法。子类的初始化方法必须调用父类的制定初始化方法,通过向super发送相应的消息初始化父类。相反,他们将调用参数比自己多的其他初始化方法(通过向self发送消息),并为自身没有的参数提供初始值,在此调用序列中,最终将会调用到指定初始化方法,完成整个初始化过程。

  5. 当没有指定初始化方法的时候,编辑器为类自动添加init方法,如果有,编辑器就不再添加。Person *person = [[Person alloc] init];,实际上在Person类中没有init方法,所以会自动添加,如果有的话,会调用有的init方法。

  6. 两个方法是否相同和参数返回值是否相同无关,只看方法名

8. selfsuper 关键字

  1. self是类的隐藏参数,指向当前调用方法的类,另一个隐藏参数是_cmd,代表当前类方法的selector
  2. super并不是隐藏参数,它只是一个“编译器指示符”,它和self指向的是相同的消息接受者。
  3. 当使用self调用方法时,会从当前类的方法中开始找,如果没有,就从父类中开始找;而当使用super时,则冲父类的方法列表中开始找,然后调用父类的这个方法。
  4. 打印字符串的时候使用NSLog的时候,字符串对应的是%@

9. @class#import 关键字

  1. import会包含这个类的所有信息,包括实体变量和方法,而@class只是告诉编辑器,其后面声明的名称是类的名称,至于这些类是如何定义的,暂时不用考虑

  2. 在头文件中,一般只需要知道被引用的类的名称就可以了,不需要知道其北部的实体变量和方啊,所哟在头文件中一般使用@class来声明这个名称是类的名称。而在实现类里面,因为会用到这个引用类的内部的实体的变量和方法,所以使用#import来包含这个被引用类的头文件。

  3. 如果有循环以来关系,如A->B,B->A这样的相互依赖关系,如果使用#import来相互包含,那么就会出现编译错误,如果使用@class在两个头文件中相互声明,则不会有编译错误出现。

  4. 一般来说@class是放在interface中的,只是为了在interface中引用这个类,把这个类作为一个类型来用的。在实现这个接口的实现类中,如果需要引用这个类的实体变量或者方法之类的,还是需要import。

  5. @class一般用在.h文件中,#import用在.m文件中。

10. property 属性

  1. 可以自动生成SetGet方法

    // 在.h文件中
    @property(nonatomic) int myNumber;
    // 在.m文件中
    @synthesize myNumber;
    
  2. 在@property()的括号中,可以填写的属性有,例如@property(nonatomic, readonly)表示只有get方法且非原子性。

    • readwrite: 默认
    • readonly: 只读,意味着没有set方法
    • assign: 默认,引用计数不断增加
    • retain: 引用计数增加1
    • actomic: 默认,原子性
    • nonatomic: 非原子性
  3. 点语法,就是对象.对象中的变量,可以访问

  4. 静态变量,也就是static int count = 10;表示全局变量。存放在.m文件中了。

11. 类的继承

  1. NSObject是所有类的父类,被继承的类叫超类或父类(superclass),继承父类的类叫子类(subclass)
  2. OC中继承的语法规则:@interface 子类:父类

12. 类的重载

  1. 在子类中重写父类中的方法,然后直接调用子类的对象,调用该方法的时候,调用的是子类的,想调用父类的,需要super调用。
  2. 条件是定义一个同名的新方法,新方法必须具有相同的返回类型,并且参数的个数与重载的方法相同。

13. 权限控制

  1. 默认的实例变量的作用域的范围是,这个类体内。默认继承的实例变量可以直接使用。
  2. 实例变量的权限控制符号,默认是protected。
  3. OC中只是支持但继承,共性的东西放在父类,个性的东西放在子类。

14. 多态、动态绑定和动态类型

  1. 动态类型:OC在运行时再能确定对象的实际类型。
    1. 通过声明id对象,在编译期无法确定该对象的类型,在运行期可以确定对象类型。
  2. 动态绑定:程序在执行时才能确定对象调用的实际方法。
  3. 多态:一种事物的多种状态,不同类的对象可以定义共享相同名称的方法,这个就是多态的表现形式。
  4. 多态的条件:有继承关系、有方法重写、父类的声明变量指向子类对象。
14.1 判断
// 对象是不是aClass或其子类的成员?
- (BOOL) isKindOfClass:(Class)aClass;	

// 对象是不是aClass的成员?
- (BOOL) isMemberOfClass:(Class)aClass;

// 对象是不是aClass的子类
- (BOOL) isSubclassOfClass:(Class)aClass;

// 对象是否能相应aSelector指定的方法
- (BOOL) respondsToSelector:(SEL)aSelector;

// 对象调用aSelector指定的方法
- (id) performSelector:(SEL)aSelector;

// 对象调用aSelector执行的方法,传递参数object
- (id) performSelector:(SEL)aSelector 
            withObject: (id) object;
           
// 对象调用aSelector指定的方法,传递参数object1和object2
- (id) performSelector:(SEL)aSelector 
            withObject: (id) object1 
            withObject: (id) object2;

// 判断两个对象是否时同一个类型
if ([Audi class] == [Benz class]) { ... } 

15. 异常处理

  1. 使用@try处理异常,还有@catch、@finally
    @try {
        [car noSuchMethod];
    } @catch (NSException *exception) {
        NSLog(@"catch exception %@ %@", [exception name], [exception reason]);
    } @finally {
        // code ...
    }
    

猜你喜欢

转载自blog.csdn.net/Ankie_/article/details/88187836