标签:
主要内容概括
标号 | 主题 | 内容 |
---|---|---|
一 | 封装 | 面向对象三大特性;封装的概念/原因/好处/原则 |
二 | *getter和setter | setter / getter方法;注意点 |
三 | 自定义代码段 | 如何自定义代码片段 / 导入代码片段 |
四 | *点语法 | 点语法基本使用/本质/注意 |
五 | self关键字 | 类方法与对象方法中的self/全局变量成员变量局部变量/总结/使用注意 |
六 | *继承 | 继承基本概念/OC中的继承关系以及如何实现继承/相关特性 |
七 | Super | super基本概念/作用/使用场景 |
八 | *多态 | 多态概念/条件/优点/实现多态的原理/注意点 |
九 | 实例变量修饰符 | 实例变量的作用域/变量修饰符在子类中的访问/实例变量作用域使用注意事项 |
十 | description | description基本概念/重写的方法/陷阱 |
// 1成员变量是public的,也就是公开的,我们不能控制外界如何赋值, 外界有可能赋值一些脏数据 @interface Gun : NSObject { @public// 公开成员变量 int _bulletCount;// 子弹数量 } @end // 可以利用封装来解决这个问题 // 封装:是指隐藏对象的属性和实现的细节,仅对外提供公共的访问方法
类是数据与功能的封装,数据就是成员变量,功能就是类方法或对象方法
对数据的封装,也就是对成员变量的封装
不封装的缺点:当一个类把自己的成员变量暴露给外部的时候,那么该类就失去对该成员变量的管理权,别人可以任意的修改你成员变量。
封装就是将数据隐藏起来,只能用此类的方法才可以读取或者设置数据,不可被外部任意修改是面向对象设计本质。降低了数据被误用的可能性,提高代码的灵活性
好处
原则
作用:用来设置成员变量,可以在方法里面过滤掉一些不合理的值
命名规范:
如:如果成员变量为int _age 那么与之对应seter方法为 (void) setAge: (int) age; (void) setAge: (int) age { _age = age; }
setter方法的好处
//只要_max或者_min发生变化就重新计算_average,否则不重新计算 - (void)setMax:(int)max { _max = max; _average = (_max + _min) / 2; } - (void)setMin:(int)min { _min = min; _average = (_max + _min) / 2; } - (int)average { _average = average; }
作用:为调用者返回对象内部的成员变量的值
命名规范:
举例
如:如果成员变量为int _age 那么与之对应geter方法为 - (int)age; - (int)age { return _age; }
在实际的开发中,不一定set和get方法都会提??供,如果内部的成员变量,比如学生的学号或计算出来的数据。这样的数据只允许外界读取,但是不允许修改的情况,则通常只提??供get方法而不??提供set方法 。
成员变量名的命名以下划线开头,get和set方法名不需要带下划线
成员变量名使用下划线开头有两个好处
- 如果某一个属性只提供getter方法,称为只读属性
- 如果某一个属性只提供setter方法,称为只写属性
- 如果某一个属性不提供getter和setter方法,称为私有属性
- 如果某一个属性提供了getter和setter属性,称为可读可写属性
/Users/zhangxiaoliang/Library/Developer/Xcode/UserData/CodeSnippets
下p.name = @"hmj"; p.age = 20; p.height = 1.7; NSLog(@"name = %@, age = %i, height = %f", p.name, p.age, p.height);
左侧
的时候,点语法会被展开为setter
方法的调用,其他情况(等号右侧、直接使用
)为点语法展开为getter
方法的调用
p.name = @"hmj"; 转换成 [p setName:@"hmj"]; NSLog(@"name = %@, age = %i, height = %f", p.name, p.age, p.height); 转换成 [p name]; [p age];
点语法的本质是方法的调用,而不是访问成员变量,当使用点语法时,编译器会自动展开成相应的方法调用。
点语法一般用于给成员变量赋值,如果不是给成员变量赋值一般情况下不建议使用,但也可以使用
切记点语法的本质是转换成相应的对setter和getter方法调用,如果没有set和get方法,则不能使用点语法。
不要在getter与setter方法中使用本属性的点语法,否则会引发死循环
- (void) setAge:(int)age { // 下面的代码会引发死循环 self.age = age; //编译器展开后 [self setAge:age] } - (int) age { // 下面的代码会引发死循环 return self.age; // 编译器展开后 [self age] }
一个类有且仅有一个类对象
。类名
调用方法就是给这个类对象
发送消息,也可以用self来调用类方法对象可以有0个或多个
对象
调用方法就是给这个对象
发送消息self在对象方法中,就是代表调用当前这个方法的那个对象,可以通过self调用本类中其他的对象方法,访问成员变量,但不能通过self调用本类的类方法。
通过self调用方法的格式:[self 方法名];
+ (void)openFlashLight { [self openFlashLight]; }
@interface 子类名称 : 父类名称 @end
注意:不能重写继承过来的属性
- 如果找到了就执行这个方法,就不再往后查找了
基类的私有属性能被继承,但不能在子类中访问。
继承的优点
继承缺点
- self是一个隐私参数;
- super 并不是隐藏的参数,它只是一个“编译器指示符”,它和 self 指向的是相同的消息接收者
self refers to the object receiving a message in objective-C programming. super is a flag that tells the compiler to search for the method implementation in a very different place.
It begins in the superclass of the class that defines the method where super appears.
直接
调用父类中的某个方法,而self会先在自己的方法中找是否有这个方法,因而造成死循环2.super在对象方法中,那么就会调用父类的对象方法;super在类方法中,那么就会调用父类的类方法;可以利用super在任意方法中调用父类中的方法
使用场合:
程序中的多态:父类指针指向子类对象
优点
狗 *g = [狗 new]; 动物 *a = [狗 new];//多态 猫 *c = [猫 new]; 动物 *b = [猫 new];//多态 [b eat];//调用的是狗的方法 动态类型: 在编译时编译器只会检查当前类型对应的类中有没有调用的方法(有就编译成功,否则失败) 在运行时,系统会自动判断b的真实类型
多态的主要好处就是简化了编程接口
。它允许在类和类之间重用一些习惯性的命名
,而不用为每一个新加的函数起一个新名字。这样,编程接口就是一些抽象的行为的集合,从而和实现接口的类的区分开来。
多态也使得代码可以分散在不同的对象中而不用试图在一个函数中考虑到所有可能的对象
。这样使得您的代码扩展性和复用性更好一些。当一个新的情景出现时,您无须对现有的代码进行改动,而只需要增加一个新的类和新的同名方法。
Animal *animal = nil; //实例化猫的对象 animal = [Cat new]; [animal eat]; //实例化狗的对象 animal = [Dog new]; [animal eat];
假设 子类 Dog 有一个特有的方法bark [dog bark]; Animal *an2 = [Dog new]; [(Dog*)an2 bark]; //把父类的指针,强制类型转换
Animal *an3 = [Animal new]; [(Dog*)an3 bark]; //错误的,不能强制转换
Class c = [Person class];//结果是:Person
NSLog(@"%@",objectA);
description方法默认返回对象的描述信息(默认实现是返回类名和对象的内存地址)
description方法是基类NSObject所带的方法,因为其默认实现是返回类名和对象的内存地址, 这样的话,使用NSLog输出OC对象,意义就不是很大,因为我们并不关心对象的内存地址,比较关心的是对象内部的一些成变量的值。因此,会经常重写description方法,覆盖description方法 的默认实现
对象方法
/**对象方法:当使用NSLog输出该类的实例对象的时候调用*/ -(NSString *) description { return [NSString stringWithFormat:@"狗腿数:%d,狗眼数%d\n",_legNum,_eyeNum]; }
/**类方法:当使用NSLog输出该类的类对象的时候调用*/ +(NSString *) description { return @"+开头的description方法"; }
访问属性的方式
p->_age;
[p age];
p.age;
self.age
[self age];
self->_age;
(建议)千万不要在description方法中同时使用%@和self,下面的写法是错误的
- (NSString *)description { return [NSString stringWithFormat:@"%@", self]; }
同时使用了%@和self,代表要调用self的description方法,因此最终会导致程序陷入死循环,循 环调用description方法
当[NSString stringWithFormat:@“%@”, self]; 使用它时,循坏调用,导致系统会发生运行时错误。
当该方法使用NSLog(“%@”,self) 时候, 系统做了相关的优化,循坏调用3次后就会自动退出
标签:
原文地址:http://www.cnblogs.com/HMJ-29/p/4687345.html