码迷,mamicode.com
首页 > 其他好文 > 详细

OC 03

时间:2015-10-30 00:42:28      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:

 

#mark- 01-封装基本概念
//问题1:面向对象三大特性有哪些?
答: 封装 继承 多态
 
 
//问题2:什么是封装?封装的好处?封装的规范?
答:
1.屏蔽内部实现的细节, 仅仅对外提供共有的方法/接口
2.保证数据的安全性,将变化隔离
3.一般情况下不会对外直接暴露成员变量, 都会提供一些共有的方法进行赋值成员变量都需要封装起来
 
//问题3:为什么要进行封装?
答:
1.屏蔽内部实现的细节, 仅仅对外提供共有的方法/接口
 
 
---------------------------------------------------------------------
#mark- 02-getter-setter方法
//问题1:什么是setter方法?sett方法的书写格式? 什么是getter方法?gett方法的书写格式?
答:
1.由于将来我们经常需要定义一些方法来操作成员变量,而每个方法都必须有一个有意义的名称,而想名字非常难,所以就有了getter-setter方法
2.getter-setter方法格式和写法都是固定的,所以只要有getter-setter方法我们就不用煞费心思的去想方法名称了,解决我们起名字难问题
3.getter-setter方法还是程序员之间的一种规范,以后别人只要想给属性赋值立刻就会想到getter-setter方法,这样降低了程序员之间的沟通成本
4.setter方法还有一个好处: 监听属性的变化
 
setter方法:
作用: 设置成员变量的值
格式:
1. setter方法一定是对象方法
2. 一定没有返回值
3. 一定以set开头, 并且set后面跟上需要设置的成员变量的名称去掉下划线, 并且首字母大写
4. 一定有参数, 参数类型一定和需要设置的成员变量的类型一致, 并且参数名称就是成员变量的名称去掉下划线
 
 
getter方法:
作用: 获取成员变量的值
格式:
1. getter方法一定是对象方法
2.一定有返回值, 而且返回值一定和获取的成员变量的类型一致
3.方法名称就是获取的成员变量的名称去掉下划线
4. 一定没有参数
 
// setter方法
- (void)setCpu:(数据类型)cpu;
// getter 方法
- (返回值类型)cpu;
 
//问题3:成员变量以下划线开头有什么好处?
答:
1.区分局部变量和成员变量
 
---------------------------------------------------------------------
#mark- 03-geeter-setter方法练习
//问题:解释一下什么是只读属性?什么是只写属性?可读可写的属性?私有属性?
答:
 
1.如果某一个属性只提供了getter方法, 没有提供setter方法, 我们称这个属性为只读属性
2.如果某一个属性只提供了setter方法, 没有提供getter方法, 我们称这个属性为只写属性
3.如果某一个属性同时提供了setter方法和getter方法, 我们称这个属性为可读可写的属性
4.如果某一个属性没有提供了getter和setter,  我们称这个属性为私有属性
 
 
---------------------------------------------------------------------
#mark- 05-点语法
//问题1:什么是点语法?点语法的本质?
答:
 
1.如果给属性提供了getter和setter方法, 那么访问属性就又多了一种访问方式 , 点语法
2.点语法其实它的本质是调用了我们的setter和getter方法
3.点语法是一个编译器的特性, 会在程序翻译成二进制的时候将.语法自动转换为setter和getter方法
4.如果点语法在=号的左边, 那么编译器会自动转换为setter方法
5.如果点语法在=号的右边, 或者没有等号, 那么编译器就会自动转换为getter方法
 
 
//问题2:如何使用点语法?
答:
 
NSLog(@"age = %i, name = %@, height = %f", p.age, p.name, p.height);
 
 
//问题3:点语法注意事项?
答:
1.点语法一般用于给成员变量赋值, 如果不是给成员变量赋值一般情况下不建议使用, 但是也可以使用
 
---------------------------------------------------------------------
#mark- 06-self关键字基本概念
//问题1:什么是成员变量?什么是对象方法?什么是类方法?
答:
 
示例代码:
 
// 类的声明
@interface Perosn : NSObject
{
    // 定义在此处的为成员变量(属性/实例变量)
    int _age;
}
// 对象方法 以 - 开头  可以直接访问成员
- (void)message;
// 类方法 以 + 开头 不能访问成员便
+ (void)eat;
@end
 
// 类的声明
@implementation Perosn
// 方法的实现
- (void)message {
 
    NSLog(@"age = %d", _age);
}
// 方法的实现
+ (void)eat {
 
    NSLog(@"今天吃了西红柿炒鸡蛋");
}
 
@end
 
//问题2:如何使用self?
答:
1.类方法中可以直接调用类方法
2.类方法中不可以直接调用对象方法
3.类方法中不能访问成员变量
 
4.如果self在对象方法中, 那么self就代表调用当前对象方法的那个对象
5.如果self在类方法中, 那么self就代表调用当前类方法的那个类
总结:
我们只用关注self在哪一个方法中 , 如果在类方法那么就代表当前类, 如果在对象方法那么就代表"当前调用该方法的对象"
 
 
---------------------------------------------------------------------
#mark- 07-self注意点和应用场景
 
//问题1:self有哪些注意事项?
答:
>self会自动区分类方法和对象方法, 如果在类方法中使用self调用对象方法, 那么会直接报错
>不能在对象方法或者类方法中利用self调用当前self所在的方法
 
//问题2:self的有哪些使用场景?
答:
1.可以用于在对象方法之间进行相互调用
2.可以用于在类方法之间进行相互调用
3.可以用于区分成员变量和局部变量同名的情况
 
 
---------------------------------------------------------------------
#mark- 08-继承基本概念
//问题1:什么是继承?什么是父类?什么是子类?如何实现继承?
答:
继承:
在类名的后面加上: NSObject, 就是让当前类继承NSObject类
new方法就是继承过来的
isa指针
继承的语法
 
@interface 类名 : 需要继承的类
@interface Iphone : NSObject
 
父类:
被继承的这个类我们称之为父类/ 超类
 
子类:
继承了某个类的类我们称之为子类
 
---------------------------------------------------------------------
#mark- 09-继承其它特性(方法重写)
//问题1:什么叫方法重写?重写后是以什么顺序调用方法的?
答:
1.如果子类中有和父类中同名的方法, 那么我们称之为方法重写
2.继承中的方法调用顺序, 如果自己有就调用自己的, 如果自己没有就调用父类的
3.方法的调用顺序, 先自己再父类, 如果父类中没有再爷爷类, 如果爷爷类再没有就找爷爷的爸爸类
4.如果一直找到NSObject类都没有找到, 那么就会报错
 
//问题2:方法重写的使用场景?
答:
父类方法满足不了子类需求的时候 采用重写父类方法
 
//问题3:继承的条件是什么?
答:
发现多个类当中有重复代码就抽取一个父类
只要满足一定的条件我们才能使用继承
条件: XXXX 是 XXX   /    某某某 is a 某某某
 
//问题4:继承的优点是什么?
答:
提高代码的复用性
可以让类与类之间产生关系, 正是因为继承让类与类之间产生了关系所以才有了多态
 
 
//问题5:继承的缺点是什么?
答:
耦合性太强(依赖性太强)
 
 
---------------------------------------------------------------------
#mark- 10-super关键字
 
//问题1:什么是super?
答:
super是个编译器的指令符号,只是告诉编译器在执行的时候,去调谁的方法
 
//问题2:怎么使用super?
答:
只需要利用super给父类的方法发送一个消息, 那么系统就会自动调用父类的方法
 
 
//问题3:super使用场景?
答:
如果以后想在子类中调用父类的方法可以使用super
如果想在给父类方法进行扩展的同时保留父类的方法, 那么可以使用super调用父类同名的方法
 
---------------------------------------------------------------------
#mark- 11-多态
//问题1:什么是多态?程序中是怎么体现多态的?
答:
1.事物的多种表现形态
2.父类指针指向子类对象
 
//问题2:多态的条件是什么?
答:
1.有继承关系
2.子类重写父类方法
3.父类指针指向子类对象
 
狗 *g = [狗 new];
动物 *a = [狗 new];
猫 *c = [猫 new];
动物 *a = [猫 new];
 
//问题3:多态的优点是什么?
答:
1.多态的主要好处就是简化了编程接口。它允许在类和类之间重用一些习惯性的命名,而不用为每一个新的方法命名一个新名字。这样,编程接口就是一些抽象的行为的集合,从而和实现接口的类的区分开来。
 
2.多态也使得代码可以分散在不同的对象中而不用试图在一个方法中考虑到所有可能的对象。 这样使得您的代码扩展性和复用性更好一些。当一个新的情景出现时,您无须对现有的代码进行 改动,而只需要增加一个新的类和新的同名方法。
 
//问题4:多态的注意点?
答:
1.如果存在多态,父类是可以访问子类特有的方法
假设 子类 Dog 有一个特有的方法bark
    [dog bark];
    Animal *an2 = [Dog new];
    [(Dog*)an2 bark]; //把父类的指针,强制类型转换
 
2.如果不存在多态,父类是不可以访问子类特有的方法的
    Animal *an3 = [Animal new];
    [(Dog*)an3 bark]; //错误的,不能强制转换
 
---------------------------------------------------------------------
#mark- 12-实例变量修饰符
//问题1:实例变量修饰符有那几个关键字?\
被修饰的实例变量在本类中是否能被访问?\
被修饰的实例变量在子类中是否能被访问?\
被修饰的实例变量在其他类中是否能被访问?
 
答:
>1
1 @public (公开的)在有对象的前??下,任何地方都可以直接访问。
2 @protected (受保护的)只能在当前类和子类的对象方法中访问
3 @private (私有的)只能在当前类的对象方法中才能直接访问
4 @package (框架级别的)作用域介于私有和公开之间,只要处于同一个框架中相当于@public,在框架外部相当于@private
>2
1 @private私有成员是能被继承,也不能被外部方法访问。
2 @public 公有成员能被继承,也能被外部方法访问。
3 @protected 保护成员能够被继承,不能够被外部方法访问。
//问题2:如何判断实例变量修饰符作用域?
答:
1.在@interface @end之间声明的成员变量如果不做特别的说明,那么其默认是protected 的。
2.一个类继承了另一个类,那么就拥有了父类的所有成员变量和方法,注意所有的成员变量它都拥有,只是有的它不能直接访问。例如@private的
 
---------------------------------------------------------------------
#mark- 13-description方法
//问题1:使用%@了打印一个对象,输出的是什么内容?%@的原理是什么?
答:
1.NSLog(@"%@", objectA);这会自动调用objectA的description方法来输出ObjectA的描述信息.
 
2.description方法默认返回对象的描述信息(默认实现是返回类名和对象的内存地址)
 
3.description方法是基类NSObject 所带的方法,因为其默认实现是返回类名和对象的内存地址, 这样的话,使用NSLog输出OC对象,意义就不是很大,因为我们并不关心对象的内存地址,比较关心的是对象内部的一些成变量的值。因此,会经常重写description方法,覆盖description方法 的默认实现
 
 
 
//问题2:重写description方法注意点?
答:
 
对象方法
/**对象方法:当使用NSLog输出该类的实例对象的时候调用*/
-(NSString *) description
{
    return [NSString stringWithFormat:@"狗腿数:%d,狗眼数%d\n",_legNum,_eyeNum];
}
类方法
/**类方法:当使用NSLog输出该类的类对象的时候调用*/
+(NSString *) description
{
    return @"+开头的description方法";
}
 
千万不要在description方法中同时使用%@和self,下面的写法是错误的
 
- (NSString *)description {
    return [NSString stringWithFormat:@"%@", self];
}
 
同时使用了%@和self,代表要调用self的description方法,因此最终会导致程序陷入死循环,循环调用description方法
 
当[NSString stringWithFormat:@“%@”, self]; 使用它时,循环调用,导致系统会发生运行时错误。
 
当该方法使用NSLog(“%@”,self) 时候, 系统做了相关的优化,循坏调用3次后就会自动退出
 
---------------------------------------------------------------------
 
---------------------------------------------------------------------
 
 

OC 03

标签:

原文地址:http://www.cnblogs.com/king129/p/4922128.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!