OC课程笔记总结3-OO的三大特性

课程-三大特性
OO的三大特性即:多态性,封装性,继承性,对其他某些OO语言而言叫法不统一,但思想统一。面向对象的思想就是不要把内部的结构细节暴露给外部,只需要提供相应的接口(方法)即可,细节不需要知道。
封装性:即成员变量和方法的封装。
封装是一种代码规范,可以保证数据的安全性。通过set和get函数来对属性进行设置和获取,而不是通过@public来修饰属性,通过set方法来设置属性值,可以加上限制条件来限定赋给属性的值。set方法的命名规范:set属性名,set方法中的属性名首字母大写,但在声明属性时,属性名首字母不用大写。另外,set方法也是方法,需要参数,因此命名规范也必须参考方法的命名规范,加上对参数的信息描述。并且形参的名称不能和属性名一样(在JAVA中用this解决,OC中没有this)。set和get 并不是成对出现的,在新版本的xcode中,有了更便捷的方法。注意定义get方法是返回值要和属性值类型一致,但是在命名规范上,官方推荐get方法的命名不要出现get,get方法的方法名应该完全和属性变量名相同。

面向对象要有自己的思想,代码要有意义。什么是没有意义的代码,类似于属性的set和get方法,在新版本的xcode中,就有一个新功能为属性自动写set和get方法的代码,不需要在浪费时间为多个属性分别编写set和get方法。

不是每一个属性值都需要提供set和get方法,根据实际需求来判断是否要为一个属性提供这两个方法,他们并不是成对出现的。一般属性是只读属性时,只提供get 方法即可。

成员变量的命名规范:成员变量一定要以下划线开头,以此和get方法区分开来,因为get方法和变量名一直,只是把下划线去掉而已。并且还能和一般局部变量区分开来,只要是以下划线_开头的,都是对象的成员变量。

类名首大写驼峰,属性名方法名首小写驼峰。

封装的另一个好处是可以检测成员变量的状况,看成员变量的值是否改变。

OC的弱语法:OC是源于C的语法,OC在底层的本质是面向过程的。例如在OC中调用对象的一个不存在的方法,编译器还是会通过编译的,说明了没有语法错误,甚至链接也能通过。但是运行之后程序会马上自动终结,出现严重错误。这些说明了OC是一个弱语法的语言。错误如下:
unrecognized selector sent to instance 0x地址值。
该错误是给对象发送了一个不能识别的消息。在手机上的表现是闪退,而闪退正是因为程序崩溃了。
OC在运行过程中才会检测对象有没有实现相应的方法。检测的只是是否实现,是否声明不会检测。
而如果是只声明了方法而没有实现方法,一样可以通过编译链接,但是运行程序时也会出现上述错误。
如果是只写实现没有写声明的话,是可以正常运行的,因为OC在运行时只检测是否实现方法,只要实现了就可以运行,但是检测方法是按照代码顺序来检测的,所以实现方法必须写在main函数之前。

类方法:
在实际开发中,经常使用类方法代替对象方法来提高程序的性能。用类名调用的方法称为类方法,用对象来调用的成为对象方法。以-减号开头的都是对象的方法,所以,以+加号开头的是类方法。类方法的好处是不用创建对象就能使用方法,可以节省内存空间,但是类仍然会加载进入内存,对象在内存中是不会自动释放的。在类中,会有自己的方法列表,如果是声明了一个类方法,调用时系统会到内存中找到对应的方法,而对象的方法在对象建立后才在内存中存在??????
类方法只能用类调用,不能使用对象去调用类方法。用对象去调用方法,编译时编译器会认为该方法是一个对象方法,回去类的方法列表中找是否有以-减号开头的对应的方法,因此相当于调用了一个没有实现的对象方法,所有可以编译链接通过,但是运行之后会出现程序崩溃的错误。同理,对象方法也只能通过对象去调用,通过类名调用会出现同样的错误。类方法和对象方法可以有相同的返回类型,有相同的方法名,只要-+号不同即可。
而对于属性而言,属性是完全属于对象的,只有有了对象,才能有属性,所以如果没有建立对象,那么类方法中不能对属性进行调用。那如果建立了对象后,再用类方法去访问对象属性是否可以呢??????????
在实际开发中,能用类方法就使用类方法,开发效率更高。但是类方法不能访问成员变量,即当一个方法不需要访问成员变量时,就可以考虑定义为类方法,能用类方法尽量用类方法。判断一个方法是否应该定义为类方法,只要判断这个方法是否涉及这个类对象的属性。
类方法也是方法,也可以有参数。例如工具类,计算器,并不需要访问任何的属性,只需要传入参数即可,所以就可以定义为类方法。对于类方法而言,也可以在其他的类方法中被调用。但是要记住,每个方法都有自己的形参,对于同名的形参,不要混淆了,不是同一个参数,只要调用了方法,都会在内存中有自己的形参空间。并且不要写重复的代码实现重复的功能,要有这样的思想。类方法也可以在对象方法中被调用。在任何的函数调用时要注意是否会产生死循环的问题。在调用类方法和对象方法时不需要写-+号说明,只要对应好类名和对象名即可。

访问成员变量:
在OC中,大部分的关键字都是以@开头,但仍有小部分关键字是不以@开头的,这些关键字有一些非常常用。
self:在OC中用途非常大,在函数和方法中,要访问到变量是都遵循就近原则,就近原则只和代码距离有关,与括号无关,在c,在代码块内部可以有不同作用范围的同名变量,如果在变量名之前定义了类型名,则这个变量名就是新定义的变量名,注意区分作用范围。
self 是一个指针,指向调用当前方法的对象,谁调用就指向谁,
所以有了对象的指针,就有了对象的地址,就可以访问对象的属性和方法了。self的核心就是谁调用,就指向谁。调用是指当前的代码块是由调用的,并不是指self所指向的方法,因为self指向的方法是有self调用的,而这个self调用的方法在哪个代码块中,这个代码块由谁调用,self 就指向谁。
在oc中,self即可以用在类方法中,也可以用在对象方法中,而java中的this只能用在对象方法中,这一点是不同之处。

继承性:
继承是指类与类之间的关系。在oc中表现继承,在定义类的时用:号后跟父类即可,OC也只能是单继承。在以前的内存管理中,当一个对象不再使用时,必须使用代码把这个对象消除掉,现在的版本中,加入了arc机制,可以自动生成内存管理代码,简化了需要编写的代码量。继承一个类,即拥有了父类的一切。在oc中,不是只有一个超级父类,在oc中一共有两个超级父类,一个是NSObject,一个是NSProxy。但最常用的是NSObject。

在计算机中,应该尽量避免重复占用内存,应该尽量共享内存内容。那么父类的方法是否只有一份???还是每个子类都同时有一份????
只有父类有一份,父类的方法可以通过方法列表分享给子类。

继承的使用注意:在oc中,不允许子类中定义和父类属性名相同的属性,但是对于子类的方法名,则可以允许重名,oc是支持重写功能的。程序运行时,优先找的是子类的方法中是否有对应的方法,如果有,则执行子类的方法,如果没有再向上找父类,父类中还是没有再找父类的父类,知道超类为止。对于父类中的方法,可以只声明不实现,在子类中再实现也可以,即方法至少实现一次,不论是在父类或是子类中都不重要。在编写代码时,父类代码必须写在子类代码之前,顺序很重要。类方法和对象方法都可以重写。
每一个类都会加载到内存中,每一个类都有自己的方法列表,而对象中都有一个指针isa,用于指向类,获得类的方法列表。而每一个类中,也都有一个指针:superclass指针,用于指向父类,从而获得父类的方法列表。这个指针属性被声明在NSObject中,所以除了超类没有这个指针外,其他的类都有这个指针。
继承也有坏处:使用继承会使得代码的耦合性太强,相互关系太依赖,如果没有了父类,所有的子类都不能正常使用了。所以,继承不是随意使用。
继承和组合:当两个类有相同的属性和方法时,可以将相同的属性和方法抽取到一个父类中。另外,当一个类拥有了另个类的部分属性和方法时,也可以有抽取中部分相同的属性和方法到父类中,简化代码量。但在设计类继承关系时,一定要符合实际逻辑。而组合关系,相当于java中的接口,也是表示类之间的关系,但是组合关系没有继承关系耦合性那么强,没有了组合关系,类还能继续存在,如果没有了父类关系,那么子类全部无法存在。组合关系也可以获得另一个类中的一切。继承 :a is b;组合:a has b;
组合的声明格式:组合在类的声明属性时声明,类名 *_属性名(和组合的类名一致,不过首字母小写)。表示这个类有这么一个属性,这个属性表示和另一个类是组合关系。

同父类的子类可以组合吗??????

super关键字:
super关键字是对于继承而言的。使用super可以调用当前类的父类的方法,包括类方法和对象方法,如果父类没有这个方法,则继续往上找。判断调用的是父类的类方法还是对象方法取决于当前是处在子类的类方法调用之中还是对象方法调用之中。
super多用于子类重写父类方法时,还想保留一些父类的方法,即在父类方法上延伸,并不是完全覆盖,则可以使用super来访问父类的方法,简化代码量。

多态性:
多态,即多种形态,任何对象都有多态性。多态的表现即是使用父类的指针指向子类对象。但在调用方法和访问属性时,还是以子类的为准。因为调用方法时是一个动态的检测这个方法是否被实现,如果用多态指针去调用方法,会有一个动态绑定过程,会动态监测这个指针指向的真实类型,是子类还是父类。在使用多态指针指向子类时,真实类型是子类,所以调用对象的方法是调用子类的方法。
多态的使用注意:只能是用父类指针指向子类,不能用子类指针指向子类,但OC是弱语言,子类指向另一个子类时仍然可以编译链接通过,类指针指向另一个无关的类时也仍然可以通过。所以写代码是要根据实际逻辑来写。
如果使用子类指针指向父类呢??????????
不行,父类不能是具体的子类。

多态的好处:用于接收参数时,将参数定义为父类的指针,即可接收所有的子类对象。传入的是什么类,就访问哪个类的相关方法。
多态的局限性:在OC中,oc是一个弱语法,所以oc中的多数warning都可以认为是错误,要重视。而多态的局限性在于不能使用直接使用父类对象的指针来调用子类的特有方法(即只有子类有这个方法,在父类中没有这个方法的声明和定义),虽然可以调用成功,但是会产生warning,不符合编码规范。可以通过强制转把父类指针转为子类指针:
子类名 子类指针名=(子类名)父类指针名;
转换的只是类型而言,指针中存储的地址值是不会变的,这两个指针指向同一个子类对象。类型转换是为了让编译器更好的识别代码。OC的容错率太高,在OC中的警告类对于其他编程语言而言可能都是error,因此要把warning和error相同对待,避免编码出现warning和error。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值