2018-06-06 10:17:07 lyxleft 阅读数 3887
  • iOS开发教程之OC语言

    Objective-C是扩充C的面向对象编程语言,iOS开发是用的Objective-C语言,本专题更系统的讲解Objective-C语言当中的一些要点,类的封装、基本数据结构(NSString、NSData)、继承、内存管理(retain点语法、MyArray、AutoreleasePool、浅拷贝详述、深拷贝详述)等内容。

    41550 人正在学习 去看看 欧阳坚

一、继承

      继承是指一个新类拥有被继承类(父类)的全部属性和方法。例如,只有继承NSObject,才有创建对象的能力。NSObject是大部分类的基类(根类,root class)。


      当A类继承B类,A类就拥有B类中所有成员变量(属性)和方法。这也是继承的主要目的。

      使用场景:当我们可以说通B是一个A时,就可以使用B继承A类。

      继承的好处:代码重用;继承的缺点:父类的改变影响所有的子类。子类与父类耦合度很高。当子类中需要有自己独特的行为,不想使用父类的方法,可以把父类的方法覆盖掉:直接在子类中用一样的名字写个方法。不用在.h中写,因为父类已经声明过了,直接在.m中重写。

      如果重写了父类的方法,但还想使用父类的功能。则使用super。用来调用父类的方法。可以认为,super就是指父类。

      在继承体系中方法调用的顺序:1)在自己类中找;2)如果没有就去父类中找;3)如果父类中没有,就去父类的父类中找……直到找到基类。

      OC中只有实现没有声明的方法,是私有方法,不能在外面直接访问。但是它不是绝对私有。

      继承的注意点:OC中,类方法也是可以继承的(通过子类的类名调用父类的类方法);类方法也是可以重写的;类方法可以和对象方法重名(+表示类方法,-表示对象方法);子类中不能定义与父类中同名的成员变量。

       OC是单继承:一个类只能继承一个直接父类;
       OC是多层继承:B类继承A类,C类可以继承B类……

二、分类

     分类(类别)作用:扩展已有类的功能

     1)为原来的类增加方法;

     2)在方法内部可以访问原有类的成员变量(但这些成员变量一定要定义在头文件中)

     操作方法:

     1)为原有的类创建一个分类;2)在分类中增加新的方法的声明和实现

     在左侧栏目文件夹处右键-New File-Objective-C File-File Type选Category-Class选你还要扩展的那个类-File填分类名称(不是文件名称)。

      注意点:

      1、分类中不能扩展原有类的成员变量!

      2、如果在分类用@property:在分类中只能生成getter setter方法的声明,不能生成方法的实现和成员变量。

      3、分类可以扩充系统自带的类的功能。例如,给NSObject增加分类会影响到所有的类,但是这个东西一定要谨慎使用(笔者之前扩展了UIButton类,导致真机上所有按钮点击功能异常,但测试发布时模拟器都正常,造成用户APP大面积坏死……)

      4、你不能在分类中定义与原有类同名方法,不同的分类之间也不可以有同名的方法。如果你在分类中增加了一个与原有类同名的方法,那么分类中的方法会覆盖原有类的方法。

      5、如果多个分类中有相同的方法,执行最后编译的方法。

      6、记得要#import 分类。

三、类扩展

      在.m文件中为类增加私有的成员变量(属性)和方法

      在左侧栏目文件夹处右键-New File-Objective-C File-File Type选extension-Class选你还要扩展的那个类-File填分类名称(不是文件名称)。但通常直接在原类.m文件里写:@interface 原有类名()——这是一个常用的方法,特别是在带xib的控制器页面,一些控件我们通常用类扩展的方式,存在扩展里面,这样使得这些控件成员是私有的,不会被外界干扰到。

      与分类不一样的是:类扩展的原类名称后面的括号中没有东西,也没有.m文件。

      注意:类扩展得到的属性和方法,都是私有的!在外界中无法直接使用,即无法直接get后者set到这些成员。但是可以在.h里提供方法接口来改变这些私有属性的情况。



2015-09-09 17:16:47 ThisSummer__ 阅读数 510
  • iOS开发教程之OC语言

    Objective-C是扩充C的面向对象编程语言,iOS开发是用的Objective-C语言,本专题更系统的讲解Objective-C语言当中的一些要点,类的封装、基本数据结构(NSString、NSData)、继承、内存管理(retain点语法、MyArray、AutoreleasePool、浅拷贝详述、深拷贝详述)等内容。

    41550 人正在学习 去看看 欧阳坚

        我们在写ios程序的时候,常常发现所用到的那个类里面的方法或属性不够用,这时候我们就想往那个类里面添加一些我们想要的属性或方法。有两种方法可是实现:分别是:  1、继承 

 2、Category类目


这时有人会问:什么时候使用继承?什么时候使用Category?他们两个谁优谁劣?

说到这个问题,我们需要了解继承和Category的特性


继承:在继承中有两个概念,子类和父类(或者说子类和超类),子类和父类的关系   是,   父类拥有的方法和属子类都拥有,全部继承过来(换句话说,父类是一代产品,   功能少,而子类是第二代升级产品,有一代产品的功能之外,还额外拥有新升级    的功能。在程序中体现为,子类可以使用父类的方法和属性,    而父类不可以使     用子类的方法和属性,父类可以出现的地方,子类都可以出现)。因为继承的这个   特性,我们可以在子类里添加或重写我们所额外需要的   属性和方法(也就是二代           产品的升级功能,在一代产品的基础上修改和添加);

继承的工作方式:1、方法调度,程序运行时,先从子类里面找方法,子类里面       没有,就去父类里面找,可以一直找到最初的父类(所以子        类的方法优先级比父类高)

          2、属性调度,程序运行时,先从父类里面找方法,父类里面       没有,再去子类里面找,所以子类的的属性最好不要覆盖        父类的属性


   使用场景:希望重写原有类的方法,希望添加属性时使用继承,比如自定义UI控       件,在继承上修改添加以达到自己想要的控件



Category:如果说继承的关系的纵向扩展添加,那么Category就是横向的扩展添加(在原  有的类里再添加方法)。Category只能添加方法,不能添加属性,而且使用  Category时尽量不要修改覆盖原有类的方法。

                  使用场景:多个人团队开发一个类的时候使用;


对于最后一个谁优谁劣的问题,我们只能就使用场景而论,各有所长





2014-11-12 15:53:33 fiona_yang123456 阅读数 3702
  • iOS开发教程之OC语言

    Objective-C是扩充C的面向对象编程语言,iOS开发是用的Objective-C语言,本专题更系统的讲解Objective-C语言当中的一些要点,类的封装、基本数据结构(NSString、NSData)、继承、内存管理(retain点语法、MyArray、AutoreleasePool、浅拷贝详述、深拷贝详述)等内容。

    41550 人正在学习 去看看 欧阳坚

在OC中,扩展一个类的方式有两种:继承与分类。

继承与分类最大的区别是,一般情况下,分类不能扩展属性,继承可以扩展属性。但有一种情况下,分类可以扩展属性,那就是在本类中写的分类。

这里解释下,属性与成员变量的关系。

属性: 声明一个属性,则系统会默认给生成读取函数(set,get),可以通过点运算符来默认调用这个存取方法,并且会产生一个以_开头的成员变量。

属性就是与属性相对应的成员变量的值。在使用属性的时候,其实本质也是对成员变量的值进行操作。

成员变量:则是单纯的一个变量,不会有连带的存取方法。

属性是暴露在外面的,可以供外面进行访问调用的。而成员变量默认是protected的,保护的成员,如果被设置为public才允许外部对象调用,否则,是访问不到的。

现在回到继承与分类的话题上来。。。

1.继承Inherit

继承是任何一个面向对象的语言都有的特性。子类可以继承父类的属性与方法。

有两种情况下,必须需要使用继承,而不能使用分类的。

a. 当需要扩展的方法与原方法同名时,并且需要调用父类的同名方法,则需要继承。若此时使用分类,则分类的方法的实现会覆盖原方法的实现,不会访问到原方法。

b. 当需要扩展属性时。

2. 类别:

这是OC特有的属性,可以在不改变类名和原类的实现的前提下,进行类的扩展。

以下几种情况,最好使用分类:

a. 针对系统的一些类进行扩展。例如,NSString, NSArray, NSNumber等类,系统本身不提倡使用继承去扩展方法,因为这些类内部实现对继承有所限制,所以最好用分类的方式扩展。

b.类别支持开发人员针对自己构建的类,把相关的方法分组到多个单独的文件中,针对大型而复杂的类,可以提高维护性和可读性,并简化单个源文件的管理。

 

ps: 类别形式的扩展还分为Category 和 Extension.在Xcode中创建文件时,这两种文件被区分开来了。

Category与Extension的区别:

1. Extension 是匿名的Category。

2. Extension 定义的方法,须在类的implement 中实现,而category不强求。

3. Extension可以定义属性,而Category不能定义属性。

 

分类情况下并不是不能定义,只是不能像常规方式定义,那该如何定义呢?

动态定义属性的方法,AssociatedObject准确的翻译下是【关联对象】

    objc_setAssociatedObject(alertView, &BlockKey, block, OBJC_ASSOCIATION_COPY_NONATOMIC);

获取关联对象

    Block block = objc_getAssociatedObject(self, &BlockKey);

博文 来自: CrazyZhang1990

iOS 之类的扩展

阅读数 94

iOS中创建一个分类

阅读数 620

OC类的继承

阅读数 318

类的继承

博文 来自: lidngke
没有更多推荐了,返回首页