oc基础知识3:存取方法、静态变量、协议

来源:互联网 发布:mac如何下载win10 编辑:程序博客网 时间:2024/05/16 16:16

               

       1、属性:在定义类的接口时,有成员属性和方法两部分;

      

       1、@interface @property的区别

          1)@interface大括号中声明的是“成员变量”;

          2)@property声明的是属性 @synthesize@property配对,意义是合成”。


         成员变量与属性的区别主要分为以下两点:

        1)、在@interface中定义变量的话,为当前类的私有(private),顾名思义,这些变量只能在当前类中被访问;而用@property声明的变量为公有(public),可以在当前类或者其他类中被访问。

        2)、使用@interface声明的变量,使用变量名进行访问;@property声明的变量用“ _变量名”(不用@synthesize的方式,后面会提及),或者“self.变量名”的形式进行访问。


        2、 成员属性设的设定可以用setter方法,成员属性的访问可以用getter方法,objective-c中有另外一组代替该种方法的关键字

          @property,它与@synthesize成对使用,前者用在头文件中,等效于在头文件中声明了两个方法,   

          例如:

          @property int number

          等价于

          -voidsetNumber:(int) n;

          -(int) number;

 

           而@synthesize后者用在.m文件中等价于在.m文件中实现两个方法,如@synthesize等价于:

            -voidsetNumber:(int)n

          {

                  Number=n;

           }

           -(int) number

          {

                  return number;

           }

            以上等效的函数部分由编译器自动填充完成,不需要开发者再重复编写代码,简化了编码输入工作量。


          3、声明格式:

            声明@property的格式为

            @property(参数1,参数2)参数类型 参数名;

            其中参数主要分为三类:

            读写属性: (readwrite/readonly

            setter语意:(assign/retain/copy

            原子性: (atomicity/nonatomic

            各参数意义如下:

    readwrite:是默认的,产生setter\getter方法

    readonly:只产生简单的getter,没有setter

     assign:默认类型,setter方法直接赋值,而不进行retain操作。用于基础数据类型和c类型数据,如int、float、double和NSInteger,CGFloat,bool等表示单纯的复制。还包括不存在所有权关系的对象,比如常见的delegate。

     retain:setter方法对参数进行release旧值,再retain新值。修饰其他NSObjective及其子类。

     copy:setter方法进行Copy操作,与retain一样。可以修饰字符串、遵循NSCoding协议的对象,不能修饰数组和字典。

     nonatomic:禁止多线程,变量保护,提高性能。

    atomicity:允许多线程。

    weak:weak跟assign的效果相似,不同的是weak在对象被回收之后自动设置为nil。而且weak智能用在iOS 5或以后的版本,对于之前的版本,使用unsafe_unretained。

   strong:是在ARC伴随IOS引入的时候引入的关键字是retain的一个可选的替代。表示实例变量对传入的参数要有所有权关系即强引用。strong跟retain的意思相同并产生相同的代码,但是语意上更好更能体现对象的关系。

2、全局变量和静态变量:

     全局变量的作用范围是整个程序(如果程序是多个文件,必须在其他的文件中说明);

     静态变量(static)存放在内存的数据区(堆)中的,在程序开始运行前就分配固定字节,在程序运行过程中被分配的字节大小是不变的。只有程序运行结束后,才释放所占用的内存。它的作用域取决于静态变量的位置,若在函数里,作用域就是这个函数。在模块内(但在函数体外),静态变量可以被模块内的函数使用,但是不能被模块外的其他函数访问,是一个本地的全局变量。

     静态全局变量,是定义存储类型为静态的全局变量,只有本文件可以用,虽然整个程序包含多个程序,但静态全局变量只能作用在它定义的那个文件里,

     全局变量和静态变量都在堆里,局部变量存放在栈里。

  3、协议

       协议(protocol)是oc里一种特有的继承方式,它声明了一系列方法,却不实现,仅仅是定义了其他对象有责任实现的接口,里面的方法可以被任何一个类实现。在objective-c中,一个子类只可以继承自一个父类,而一个类可以有多个协议。

     (1)定义一个协议的格式:

        @protocol 协议名 

            

          @required

              方法声明 1;

              方法声明 2;

             ...........

        @optioal

          方法声明 1;

          方法声明 2;

            ..........

        @end

        

      @required 表示我们用到这个协议的时候必须实现这个协议的方法。

      @optional 表示我们可选择性实现以下声明的这些方法,看那个需要我们就去实现,不需要的就不实现。


      例如,要定义一个名为Sound 的协议,里面有一个名为makesound的方法,该方法必须在类里实现,然后还有名为dosomething的方法,可以实现,也可以不实现。首先创建一个名为Sound.h的头文件,定义如下:

 

         @protocol  Sound 

         @required

         -(void)  makesound;

         @optional

         -(void) dos0meting;

         @end

 

       (2)当某个类要采用这个协议时,首先包含该协议所在的头文件用#import  “Sound.h”,例如Class A要采用该协议

           ClassA.h中的代码如下:

 

          #import<Foundation/Foundation.h>

          #import"Sound.h"

         @interface ClassA:Object <Sound>

           原来的代码;

          @end

 

        当一个类要采用多个协议时,除了导入相应的协议文件外,还需要在后面的尖括号中以逗号隔开,加入协议名称。协议中的方法已经在协议文件中说明,此处不用再次声明,只需要在要扩展类的实现文件中实现协议中声明的方法即可。

           ClassA.m中的代码如下:

 

           #importClassA.h

           @implementation ClassA

              原来的代码;

              -(void)  makesound 

               {

               实现代码;

               }

           @end

 

      协议的两个修饰符@optional@required,由修饰符修饰的方法,前者代表采用该协议的类中可以选择不实现该方法,后者代表采用该协议的类必须实现该方法。协议修饰符的默认值为@required,实现。