OC当中特有的语法

一、分类Category

1.什么是分类

>分类:可以在不改变原有类前提的情况下,拓展很多新方法,但是不能拓展新的成员变量。

如果想要扩展新的成员变量,可以考虑使用继承。

2.分类的书写xingshi

>1),分类头文件:

@interface 原有类 (分类名称)

// 方法声明

@end

> 2),分类的实现文件:

@implementation 原有类 (分类名称)

// 分类声明中的方法的实现

@end

3.使用注意

分类使用注意:

1),在分类中不能访问原始类primary中@private作用域的成员变量

2),如果分类实现了和原始类同名的方法,会覆盖原始类的这个方法,是的原始类的这个方法无法被调用

3),如果多个分类都实现了和原始类同名的方法,那么会优先调用分类的这个方法,而且是最后参加编译的那个优先级更高。

(也就是:分类(最后参与编译的优先)-->原始类-->原始类的父类)

所以,最好不好在分类中实现和原始类同名的方法

4.分类的好处

1), 可以将一个很大的项目分模块进行开发,减小项目的复杂性。

2),很多的功能被分散到不同的类中,由团队不同成员开发,增强团队合作性。

5.相关的操作

  1)在Xcode 6.3版本中可以用快捷键 command + N 选择OS X下面的Objective-C File 建立相对应类的分类,进入项目中,不喜欢使用快捷键的可以按照File-->NEW-->File..来选择相应的文件操作。

  2)建立的分类的声明和实现形如:

// 分类的声明

#import "Father.h"

@interface Father (Work)
//{
//    int age; // 分类不能扩充成员变量
//}

- (void)work;
//- (void)walk;
@end

// 分类的实现

#import "Father+Work.h"

@implementation Father (Work)//原始类+分类名字

- (void)work
{
//    NSLog(@"名字是%@的father在工作", _name); // 在分类中不能直接访问原有类中@private作用域的成员变量
    NSLog(@"名字是%@的father在工作", self.name);
}

- (void)walk
{
    NSLog(@"名字是%@的father+work在走路", self.name);
}

@end

二、类的本质

1. 类也是个对象

> 其实类也是一个对象,是Class类型的对象,可以简称为“类对象”

  在Xcode中按住command键鼠标放在class点进去会发现原来class真正的面貌:

1 #if !OBJC_TYPES_DEFINED
2 /// An opaque type that represents an Objective-C class.
3 typedef struct objc_class *Class;
4
5 /// Represents an instance of a class.
6 struct objc_object {
7     Class isa  OBJC_ISA_AVAILABILITY;
8 };

  上述是Class类型的定义。

>类名就代表着类对象,每个类只有一个类对象。

>相关配图

2.+load 和 +initialize

>  +load

  在程序启动的时候会加载所有的类和分类,并调用所有类和分类的+load方法

  先加载父类,再加载子类;也就是先调用父类的+load,再调用子类的+load

  先加载元原始类,再加载分类

  不管程序运行过程有没有用到这个类,都会调用+load加载

>  +initialize

  在第一次使用某个类时(比如创建对象等),就会调用一次+initialize方法

   一个类只会调用一次+initialize方法,先调用父类的,再调用子类的

  定义了一个Animal类,并让Cat继承于Animal用于演示 +load 和 +initialize

 1 #import "Animal.h"
 2
 3 @interface Cat : Animal
 4 - (void)quickEat;
 5 @end
 6
 7 @implementation Cat
 8 + (void)load
 9 {
10     NSLog(@"Cat + load");
11 }
12
13 + (void)initialize
14 {
15     NSLog(@"Cat + initialize");
16 }
17
18 - (void)quickEat
19 {
20     NSLog(@"cat - eat");
21 }
22
23 @end
24 // 输出结果
 2015-08-27 07:28:51.047 03类的本质和初始化[1918:162703] Cat + load
 2015-08-27 07:28:51.047 03类的本质和初始化[1918:162703] Cat + initialize
时间: 2024-12-29 23:11:13

OC当中特有的语法的相关文章

接上次OC中特有的语法

注:(由于身边没有苹果设配 就先总结下,相关代码后补) 三.description方法 1. -descriotion 方法 使用NSLog和%@输出某个对象时候,会调用对象的-description方法,并拿到返回值进行输出 2.+description 方法 使用NSLog和%@输出某个类对象时,会调用类对象+description方法,并拿到返回值进行输出 3.修改NSLog的默认输出 重写-description或者+description方法即可. 4.死循环陷阱 如果在-descri

黑马程序员——OC的特有语法

1. 分类-Category 1. 基本用途:Category  分类是OC特有的语言,依赖于类. ? 如何在不改变原来类模型的前提下,给类扩充一些方法?有2种方式 ● 继承 ● 分类(Category) 2. 格式 ? 分类的声明 @interface 类名 (分类名称) // 方法声明 @end ? 分类的实现 @implementation 类名 (分类名称) // 方法实现 @end 3. 好处 ? 一个庞大的类可以分模块开发 ? 一个庞大的类可以由多个人来编写,更有利于团队合作 ? 4

oc 属性、点语法、KVC

?.属性 概念 属性是Objective-C 2.0定义的语法,为实例变量提供了setter. getter?法的默认实现.能在?定程度上简化程序代码,并且增强实例变量的访问安全性 定义 @interface Person : NSObject @property 属性的类型 属性的名字 @end 等价 { NSInteger _number;  //实例变量 } - (void)setNumber:(NSInteger)number; - (NSInteger)number; ?.属性的Att

黑马程序员-OC中的点语法,成员变量的作用域

点语法 点语法本质是函数的调用,不是像java中那样,是用来访问成员变量的:oc中访问成员变量是用 -> 访问的: Person *p = [Person new]; p.age = 10; // 如果点语法是进行了赋值操作,那么就相当于调用了setter方法: [p.age]; // 这样不赋值相当于调用了getter: 注意点: 尽量不要在setter或getter中调用点语法,容易引发死循环:死循环是由于递归调用引发的: // 在setter调用点语法 - (void)setAge:(in

OC里面的点语法

之前我一直对OC的点语法的理解是错误的!请看下面代码: 注释原文: //这个点语法不是去给直接给name属性赋值,而是去ZHHPerson类中寻找setName:方法,然后再给name属性赋值.在Xcode中,只要有name属性,就可以直接调用person.name,是因为Xcode自动生成了setName:方法.为了验证我的说法:可以将定义的name属性注释,然后手动添加setName:方法与name方法,那么点语法还是能用.

OC - 属性、点语法

在OC中,为单一实例变量赋值的方法称为setter方法(设置器) 在OC中,读取实例变量值得方法称为getter方法(访问器) OC里规定了setter. getter方法的书写格式 setter方法的书写格式如下: - (void)setAge:(NSInteger)age; 注意:set + 实例变量名(首字母大写),忽略下划线. getter方法的书写格式如下: - (NSInteger)age; 注意:返回值类型与变量类型一直,方法与实例变量名相同,忽略下划线 属性 /* 属性的声明:在

oc中的点语法讲解

1.类的属性都有对应的getter和setter方法, 我们可以通过 [对象 setXxx:22]/[对象 xxx]方式调用setter方法和getter方法 但是也可以用  对象.Xxx=22 /int a=对象.xxx 这种方式编译器会自动帮我们判断是要get还是set, 当用这个点语法的时候,对象访问的并不是属性,而是去调用了get或set方法

OC中的面向对象语法

一. 面向对象和面向过程思想 OC是面向对象的,C是面向过程的.面向对象和面向过程只是解决问题的两种不同思想 1. 面向对象和面向过程的区别 1) 以用电脑听歌为例子 a) 面向过程 打开电脑 播放电脑中的歌曲 关闭电脑 b) 面向对象(不是相亲的“对象”) 电脑 ² 开机 ² 播放歌曲 ² 关机 2) 区别分析 面向过程关注的是解决问题需要哪些步骤:面向对象关注的是解决问题需要哪些对象 没有开发经验很难感受到它们的区别,两种思想都能达到解决问题的目的,但是解决思路不一样 想打电话\发短信 à 

OC中的面向对象语法3

一. set方法和get方法 1. set方法和get方法的使用场合 @public的成员可以被随意赋值,应该使用set方法和get方法来管理成员的访问(类似机场的安检.水龙头过滤,过滤掉不合理的东西),比如僵尸的生命值不能为负数 2. set方法 1) 作用:用来设置成员变量,可以在方法里面过滤掉一些不合理的值 2) 命名规范: 方法都是以set开头,而且后面跟上成员变量名,成员变量名的首字母必须大写 形参名称不要跟成员变量同名 3. get方法 1) 作用:返回对象内部的成员变量 2) 命名