OC 03

#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次后就会自动退出

---------------------------------------------------------------------

---------------------------------------------------------------------

时间: 2024-12-29 06:06:37

OC 03的相关文章

OC第七天笔记2016年03月22日(周二)A.M

1. 可变字符串 NSMutableString* mstr = [[NSMutableString alloc] initWithCapacity:10]; 增 删 改 替换 //[mstr length] [mstr insertString:@"http://" atIndex:0]; //第一个参数:即将要插入的字符串 //第二个参数:插入的位置(下标) NSLog(@"%@",mstr); //http://www.baidu.com [mstr inse

OC第六天笔记2016年03月21日(周一)A.M

在OC中,我们通过使用协议和分类来实现多继承的效果. 协议只能声明方法,而不能有任何实例变量. 声明协议: @protocal protocolName<protocol ,…> @optional //可选择的 @require//必须的  默认 @end eg: 1 @protocal rules<NSObject > 2 3 4 5 @interface abc: NSObject <rules> 6 7 @end //协议中只有方法声明,没有实例变量 在类中的实

OC第四天笔记2016年03月18日(周五)A.M

在OC中没有多继承 继承方式公有继承:派生类对象可以当做基类对象来使用 类中实例变量的默认权限为受保护,方法默认权限公有. 类中方法都是虚方法 在OC继承中,基类的所有成员都可以被派生类继承. 在派生类中定义一个原型和基类相同的方法,称派生类重写了此方法. id代表任意类型, 在程序运行期间才会确定id所代表的类型. 使用类方法创建的对象会被自动放入“自动释放池”中,所以不需要再手动release. 派生类中扩展实例变量时,不能与基类部分实例变量同名.

『iOS开发』「OC」03 - 封装

一.面向对象和封装 面向对象的三大特性:封装(成员变量).继承和多态 在OC语言中,使用@interface和@implementation来处理类.   @interface就好像暴露在外面的时钟表面,像外界提供展示以及接口.@implementation就好像隐藏在时钟内部的构造实现,把具体的实现封装了起来. 二.set方法 在开发过程中,考虑到安全性要求,我们一般不在成员变量名前面使用@public.@protected等关键字修饰,而是使用Set方法来为对象提供成员变量的值.在set方法

O-C相关-03:面向对象概念的具体介绍

1.面向对象的概念 面向对象(object-oriented ;简称: OO) 至今还没有统一的概念,我这里把它定义为:按人们认识客观世界的系统思维方式,采用基于对象(实体)的概念建立模型,模拟客观世界分析.设计.实现软件的办法.通过面向对象的理念使计算机软件系统能与现实世界中的系统一一对应. 2.面向对象编程(Object Oriented Programming-OOP)是一种解决软件复用的设计和编程方法.这种方法把软件系统中相近相似的操作逻辑和操作应用数据.状态,以类的型式描述出来,以对象

OC第七天笔记2016年03月21日(周一)P.M

1. 使用NsCompare 或者isEqualToNumber来实现NsNumber对象的比较. NsCompare:比较大小关系 isEqualToNumber:是否相等 长度:[str length] 查找子串: NSRange rr = [str rangeOfString:@”ll”]; If(rr.location == NSNotFound){ NSLog(@”ll is not in str ”); } else { NSLog(@”ll is in str”);}

OC第八天笔记2016年03月23日(周三)A.M

1.     NSFileManager: ----------------------main--------------------------- 1 <font size="3">#import <Foundation/Foundation.h> 2 #import "Student.h" 3 int main(int argc, const char * argv[]) { 4 @autoreleasepool { 5 6 //1.

OC第九天笔记2016年03月24日(周四)A.M

1.  打开ARC:-fobjc-arc 关闭ARC:-fno-objc-arc 2.  在ARC中内存回收由编译器完成 声明对象之后,未将对象置为nil,则对象作用域结束时,空间才会被回收:如果将对象置为nil,则对象的空间会立即回收. 3.  __strong __weak __strong:强引用,拥有某一块堆空间的所有权.默认. __weak:弱引用,仅拥有使用权. 一旦强引用置为nil,弱引用会被自动置为nil. 声明属性:如果属性为对象实例变量,赋值方式strong,否则使用weak

024-Foundation框架(下)-OC笔记

学习目标 1.[理解]NSDictionary 2.[了解]NSDictionary的常用方法 3.[掌握]NSDictionary的遍历 4.[理解]NSMutableDictionary 5.[了解]NSFileManager 6.[了解]Foundation常用结构体 7.[了解]NSNumber 8.[了解]NSValue 9.[了解]NSDate 10.[了解]集合的内存管理 11.[了解]copy和mutableCopy 12.[理解]单例模式 一.NSDictionary NSAr