iOS笔记--Day04课堂笔记

英汉词典推荐:欧路词典

开发注意:开发中尽量让错误发生在编译时,不要发生在运行时!

类回顾:

属性就是专门储存数据的

属性(成员变量)的命名以下划线开头的好处:可以区分属性和局部变量

super并不是关键字,而是编译器的指令符号:

self的用法:与super相似,调用除了自己以外的父类们的方法(而self则是调用自身坐在的类中的方法)

为什么要用super:如果需要在子类中调用父类的方法可以用super

注意:在当前方法内使用self调用当前方法名的方法会造成死循环,但是super不会(super只会向上级找,终会有停止的时候)

应用场景:重写父类的方法,并且需要保留父类方法中的功能,这种情况使用super



面向对象第三大特性,多态:

多态是指:事物的多种表现形态

编译:在一个父类中使用多态指向子类并调用子类的方法时,编译器会先在这个父类中找有没有声明和实现同名的方法(也就是说:子类必须重写父类的方法),如果没有声明则编译报错(如果只声明没有实现,编译器会报警告),如果有声明和实现则可以进行编译.

运行:运行的时候会按照子类中的方法执行

父类使用多态调用子类特有方法的解决办法:可以通过强制类型转换解决父类调用子类特有方法的问题,如下:

Animal*ani2 = [[Catalloc]init];

Cat*c = (Cat*)ani2;//强制类型转换为Cat类型

[cclamb];//调用Cat中的特有方法

使用多态的优点:提高了代码的拓展性


实例变量(成员变量)的修饰符:

作用域:从出现的位置开始直到遇到下一个修饰符或大括号结束

@public:可以在其他类中访问,也可以在本类中访问,也可以在子类中访问

@private(私有的)(默认情况下,在@implement中定义的属性都是private的(纯私有),而且定义在@implement中定义的私有变量,外界看都看不到,子类也不会拥有):不可以在其他类中访问,可以在本类中访问,不可以在子类中访问(只要继承就会拥有,但是拥有不一定可以访问)

@protected(默认情况下,在@interface中定义的所有的属性都是protected):不可以在其他类中访问,可以在本类中访问,也可以在子类中访问

@package:介于private与public之间,在当前包里就是public类型的,在其他包里就是private类型的

description:

只要使用%@打印对象名称,就会默认调用-的description方法,使用%@打印类对象名称,就是调用+的description方法,想打印对象(或类)的信息就在类中重写description方法,里面写上要打印的内容

建议:在description方法中尽量不要使用self,在description中使用%@打印self会造成死循环

class方法:给类发送class消息就会返回当前类的名字

私有方法的定义:如果方法只有声明,没有实现,就称为这个方法是私有方法(OC中没有真正的私有方法)

@property(重点):

@property是一个编译器指令(与预处理指令一样):编译器会在编译的时候将@proberty替换成某一段代码

注意:4.4之前只可以使用@property代替getter和setter方法的声明

@property的书写规范:@property int age;

@property替代setter-getter声明的方式:

@propertyintage;

- (void)setAge:(int)age;

- (int)age;

//Xcode4.4之前编译器会在编译的时候将第一段代码转换为第二段代码和第三段代码

@synthesize也是一个编译器指令:

@synthesize的书写规范:@synthesize age = _age;

如果synthesize后面只写了age(例如:synthesize age;)那么用户赋值与取值的操作都是针对age的,而不是_age


加强版@property:

Xcode4.4之后@property可以直接生成setter和getter方法的声明和实现

加强版@property的书写规范与普通@property的书写方式相同:

@propertyintage;//这一句代码代替了原来getter-setter的四段代码(两个声明,两个实现),并且同时生成了一个纯私有的变量_age

@property会将值赋给下划线开头的变量(而不是同名变量,与@synthesize有区别)

@property的弊端:他只会生成最简单的getter和setter方法,并不会对传入的数据进行过滤/监控等操作,如果需要对数据进行过滤,那么需要重写setter和getter方法

已有@property已经存在的情况下,重写setter-getter:

只重写setter方法,那么编译器会自动生成一个getter方法,并且自动生成私有变量

只重写getter方法,那么编译器会自动生成一个setter方法,并且自动生成私有变量

但是如果同时重写getter方法和setter方法,那么编译器不会自动生成成员变量!

增强@property这段代码在编译的时候做了三件事:

生成实例变量

生成setter_getter声明

生成setter_getter方法的实现

@property的修饰符:

定义一个属性的完整格式:@property(修饰符) 属性类型 属性名称;

readonly(只读):值生成getter方法,不生成setter方法

readwrite(可读可写):既生成setter方法,也生成getter方法

没有只写的修饰符,如果需要,自己手写

另外还可以在(修饰符)的位置写上重命名的getter方法或setter方法,如下

@property(getter= isMarried)intmarried;//这样定义后,我们仍然可以利用setMarried给_married赋值,但是如果需要取值的话,就需要通过isMarried方法了,而不是married方法

id类型(id类型是一个动态数据类型):

默认情况下所有的数据都是静态数据类型

静态数据类型:在编译的时候就知道这个变量属于什么类型,包含哪些属性和方法,如果访问了不属于自己的方法或属性,那么编译器在编译的时候回报错

动态数据类型:在编译的时候编译器不知道这个变量的真是类型,所以如果这个变量访问了不属于自己的属性或方法,编译器也不会报错

id的本质:id == NSObject *

NSObject *与id的区别:

NSObject * 是一个静态数据类型,id是一个动态数据类型

通过静态数据类型定义变量不可以调用子类特有的方法

动态数据类型在定义变量的时候可以调用子类特有的方法

动态数据类型的弊端:由于动态数据类型可以调用任意一个方法,有可能调用到不属于自己的方法,编译器不会报错,可能导致运行时的错误

id的应用场景:一般用在多态,可以减少代码量,避免调用子类特有方法需要强制类型转换

如何避免动态数据类型引发运行时的错误:一般情况下,如果使用动态数据类型定义一个变量,在调用这个变量的方法之前会进行一个判断,判断当前变量是否能够调用这个方法,例如:

idstu3 = [[Studentalloc]init];//定义一个动态的对象stu3

if([stu3isKindOfClass:[Studentclass]])//判断stu3是否属于Student类或Student类的子类,注意isKindOfClass的返回值是一个BOOL类型,class方法是生成一个类的类对象,例如[Person class]就是生成Person的类对象

{

//表达式

}

idstu3 = [[Studentalloc]init];

if([stu3isMemberOfClass:[Studentclass]])//判断stu3是否属于Student类

{

//表达式

}

扩展:

[PersonisMemberOfClass:[Studentclass]]//判断Person是不是Student的子类

new方法的实现原理:

new:                         (从今以后不能使用new了)

alloc + init:               (建议以后都使用这种方法创建对象,可以统一编码格式)


OC中是伪构造方法

构造方法的用途:用于初始化一个对象

重写init方法必须按照苹果规定的格式写:

使用self初始化父类

判断父类是否初始化成功

成功的话,初始化子类的值

返回地址:return self;

重写init的简化写法(最常用):

- (instancetype)init

{

if(self= [superinit]) {

_cli= [[Clipalloc]init];

}

returnself;

}

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

推荐阅读更多精彩内容