OC中重要的一些概念<一>

继承

方法重写

  • 在子类中实现与父类中同名的方法,称之为方法重写;

  • 重写以后当给子类发送这个消息的时候,执行的是在子类中重写的那个方法,而不是父类中的方法。

  • 如果想在子类中调用被子类重写的父类的方法,可以通过super关键字

  • 使用场景:当从父类继承的某个方法不适合子类,可以在子类中重写父类的这个方法。

继承中方法调用顺序

  • 1、在自己类中找

  • 2、如果没有,去父类中找

  • 3、如果父类中没有,就去父类的父类中

  • 4、如果父类的父类也没有,就还往上找,直到找到基类(NSObject)

  • 5、如果NSObject都没有就报错了

  • 如果找到了就执行这个方法,就不再往后查找了

OC中的继承关系

  • B类继承A类,那么B类将拥有A类的所有属性和方法,此时我们说A类是B类的父类,B类是A类的子类

  • C类继承B类,那么C类将拥有B类中的所有属性和方法,包括B类从A类中继承过来的属性和方法,此时我们说B类是C类的父类,C类是B类的子类

  • 注意:

  • 基类的私有属性能被继承,不能在子类中访问。

  • OC中的继承是单继承:也就是说一个类只能一个父类,不能继承多个父类

  • 子类与父类的关系也称为isA(是一个)关系,我们说 子类isA父类,也就是子类是一个父类,比如狗类继承动物类,那么我们说狗isA动物,也就是狗是一个动物。在如汽车继承交通工具,那么们说汽车isA交工工具,也就是汽车是一个交通工具

  • 继承的合理性:引用《大话西游》里的一句话来描述继承的。“人是人他妈生的,妖是妖他妈生的!”

继承的注意事项

  • 子类不能定义和父类同名的成员变量,私有成员变量也不可以;因为子类继承父类,子类将会拥有父类的所有成员变量,若在子类中定义父类同名成员变量 属于重复定义。

  • OC类支持单一继承,不支持多继承;也就是说一个类只能有一个直接父类

多态基本概念

什么是多态

  • 多态就是某一类事物的多种形态

  • 程序中的多态:父类指针指向子类对象

多态的条件

  • 有继承关系

  • 子类重写父类方法

  • 父类指针指向子类对象

  • 表现:当父类指针指向不同的对象的时候,通过父类指针调用被重写的方法的时候,会执行该指针所指向的那个对象的方法

  • 多态的主要好处就是简化了编程接口.它允许在类和类之间重用一些习惯性的命名,而不用为每一个新加的函数命名一个新名字.这样,编程接口就是一些抽象的行为的集合,从而和实现接口的类的区分开来.

  • 多态也使得代码可以分散在不同的对象中而不用 试图在一个函数中考虑到所有可能的对象这样使得您的代码扩展性和复用性更好一些.当一个新的情景出现时,您无须对现有的代码进行改动,而只需要增加一个新的类和新的同名方法.

私有变量和私有方法

私有变量

  • 实例变量(成员变量)既可以在@interface中定义, 也可以在@implementation中定义

写在@implementation中的成员变量, 默认就是私有的成员变量, 并且和利用@private修饰的不太一样, 在@implementation中定义的成员变量在其它类中无法查看, 也无法访问

在@implementation中定义的私有变量只能在本类中访问,在其他类中无法查看,也无法访问

  • 无论使用什么成员变量修饰符修饰成员变量,我们都可以在其他类中看到这个变量,只不过有的成员变量修饰符修饰的变量我们不能操作而已.

私有方法

  • 如果只有方法的实现,没有方法的声明,那么该方法就是私有方法

  • 在OC中没有真正的私有方法,因为OC是消息机制

@property编译器指令

  • 什么是编译器指令? 编译器指令就是用来告诉编译器要做什么

  • @property会让编译器做什么呢?

  • @property 用在声明文件中告诉编译器声明成员变量的的访问器(getter/setter)方法

  • 这样的好处是:免去我们手工书写getter和setter方法繁琐的代码

  • @property编写步骤


1.在@inteface和@end之间写上@property

2.在@property后面写上需要生成getter/setter方法声明的属性名称, 注意因为getter/setter方法名称中得属性不需要_, 所以@property后的属性也不需要_.并且@property和属性名称之间要用空格隔开

3.在@property和属性名字之间告诉需要生成的属性的数据类型, 注意两边都需要加上空格隔开


synthesize基本使用

什么是@synthesianze

  • @synthesize是编译器的指令

  • 什么是编译器的指令 ?

  • 编译器指令就是用来告诉编译器要做什么!
  • @synthesize会让编译器做什么呢?
  • @synthesize 用在实现文件中告诉编译器实现成员变量的的访问器(getter/setter)方法

  • 这样的好处是:免去我们手工书写getterr和setter方法繁琐的代码

@synthesize基本使用

  • 在@implementation中, 用来自动生成setter和getter的实现

用@synthesize age = _age;就可以代替

- (int)age{

return _age;

}

- (void)setAge:(int)age{

_age = age;

}

  • @synthesize编写步骤

1.在@implementation和@end之间写上@synthesize

2.在@synthesize后面写上和@property中一样的属性名称, 这样@synthesize就会将@property生成的什么拷贝到@implementation中

3.由于getter/setter方法实现是要将传入的形参 给属性和获取属性的值,所以在@synthesize的属性后面写上要将传入的值赋值给谁和要返回哪个属性的值, 并用等号连接

@synthesize注意点

  • @synthesize age = _age;
  • setter和getter实现中会访问成员变量_age

  • 如果成员变量_age不存在,就会自动生成一个@private的成员变量_age

  • @synthesize age;
  • setter和getter实现中会访问@synthesize后同名成员变量age

  • 如果成员变量age不存在,就会自动生成一个@private的成员变量age

  • 多个属性可以通过一行@synthesize搞定,多个属性之间用逗号连接

@synthesize age = _age, number = _number, name  = _name;


@property增强

  • 自从Xcode 4.x后,@property可以同时生成setter和getter的声明和实现

@interface Person : NSObject

{

int _age;

}

@property int age;

@end


@property增强注意点

  • 默认情况下,setter和getter方法中的实现,会去访问下划线 _ 开头的成员变量。

@interface Person : NSObject

{

@public

int _age;

int age;

}

@property int age;

@end

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

Person *p = [Person new];

[p setAge:30];

NSLog(@"age = %i, _age = %i", p->age, p->_age);

return 0;

}

  • 如果没有会自动生成一个_开头的成员变量,自动生成的成员变量是私有变量, 声明在.m中,在其它文件中无法查看,但当可以在本类中查看

  • @property只会生成最简单的getter/setter方法,而不会进行数据判断


Person *p = [Person new];

[p setAge:-10];

NSLog(@"age = %i", [p age]);

  • 如果需要对数据进行判断需要我们之间重写getter/setter方法
  • 若手动实现了setter方法,编译器就只会自动生成getter方法

  • 若手动实现了getter方法,编译器就只会自动生成setter方法

  • 若同时手动实现了setter和getter方法,编译器就不会自动生成不存在的成员变量


@property修饰符

  1. 【掌握】@property修饰符

@property修饰符

  • 修饰是否生成getter方法的
  • readonly 只生成getter方法,不生成setter方法

  • readwrite 既生成getter 又生成setter方法(默认)


@property (readonly) int age;

  • 指定所生成的方法的方法名称
  • getter=你定制的getter方法名称

  • setter=你定义的setter方法名称(注意setter方法必须要有 :)


@property (getter=isMarried)  BOOL  married;

说明,通常BOOL类型的属性的getter方法要以is开头


new方法实现原理

  • 完整的创建一个可用的对象:Person *p=[Person new];

  • new方法的内部会分别调用两个方法来完成3件事情:

  • (1)使用alloc方法来分配存储空间(返回分配的对象);

  • (2)使用init方法来对对象进行初始化。

  • (3)返回对象的首地址

  • 可以把new方法拆开如下:
  • (1)调用类方法+alloc分配存储空间,返回未经初始化的对象Person *p1=[person alloc];

  • (2)调用对象方法-init进行初始化,返回对象本身

Person *p2=[p1 init];

  • (3)以上两个过程整合为一句:Person *p=[[Person alloc] init];
  • 说明:
  • alloc 与 init合起来称为构造方法,表示构造一个对象

  • alloc 方法为对象分配存储空间,并将所分配这一块区域全部清0.


The isa instance variable of the new instance is initialized to a data structure that describes the class; memory for all other instance variables is set to 0.

  • init方法是初始化方法(构造方法),用来对象成员变量进行初始化,默认实现是一个空方法。

An object isn’t ready to be used until it has been initialized. The init method defined in the NSObject class does no initialization; it simply returns self.

  • 所以下面两句的作用是等价的

Person *p1 = [Person new];

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

  • iOS 程序通常使用[[类名 alloc] init] 的方式创建对象,因为这个可以与其他initWithXX:...的初始化方法,统一来。代码更加统一
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • 重点掌握 3 类对象和方法 对象就是一个物体 类的独特存在就是一个实例,对实例进行操作叫做方法。方法可以应用于类或...
    Coder大雄阅读 1,233评论 0 2
  • 1. 使用 #import 相对c的 include 是防止头文件的重复导入 2. NSLog 相对于 print...
    迎风起飞的猪阅读 1,644评论 6 9
  • 南方入冬偏晚,今年更晚。 前几天温暖得居然又换回了秋装,此时此刻外面却冷风嗖嗖。今天快下班,孩子他爸说今天非要吃顿...
    四月霁雨阅读 734评论 0 1
  • 撸猫是一种病。与六六结缘已经三个月有余,初识的那一天依然历历在目。那是七月中旬,盛夏,小谷准备去宠物店购买一支我们...
    伍旭升阅读 198评论 3 0
  • 来北京也快一年了吧,今天和朋友一起去三里屯吃饭,说实话第一次这么晚儿出来吃饭。挺感谢的,能够遇见这些朋友。 朋友是...
    梦游世界阅读 140评论 0 0