zoukankan      html  css  js  c++  java
  • Objective-C语法之扩展(Extension)的使用

    Objective-C 2.0增加了Class Extension用于解决两个问题:

    1. 可声明私有可读写的属性,而在类的声明中是同名的公开只读属性,从而来支持公开只读、私有可读写的属性
    2. 可声明私有方法;允许一个对象可以拥有一个私有的@interface,且可由编译器验证

    公开只读、私有可写的属性(Publicly-Readable, Privately-Writeable Properties) 

    实现一个不可变(immutable)的数据结构通常有一个好处是外部代码不能用setter方法修改对象的状态。然而,可能又希望它在内部又是一个可写的属性。Extension可以做到这一点:

    在类的扩展中声明一个属性为私有可读写,而在类的声明中定义的同名属性是公开只读的。这样,对外部代码而言,该属性将是只读的,而内部代码却可以使用它的setter方法。

    私有方法(Private Method)

    Objective-C 2.0以前,若要定义私有方法,通常是在实现文件中声明一个"Private" Category:

    BaseClass+Private.h

    1 @interface BaseClass (Private) //类的分类  
    2 - (void)privateMethod;
    3   
    4 @end

    然而,类的私用方法通常是希望存在于类的@implementation块中,而不是像上面的Category的方法那样存在于独立的@interface块中。事实上,Category仅仅是弥补了Objective-C缺少public/private限定的不足。

    真正的问题是Objective-C编译器会认为在Category中声明的方法将会在别处实现,所以编译器并不会尝试确认它们是不是真的都被实现了。也就是说,开发者声明的方法有可能并未实现,而且编译器也不会有什么警告。编译会以为它们将在别的地方或独立的文件中实现。

    使用Exteionsion,在其中声明的属性和方法的实现将放在Class的@implementation区块中。否则,编译器就会报错。

    ExtensionClass.h

    1 @interface ExtensionClass : NSObject //类的声明  
    2 @property (retain, readonly) float value; //声明公开只读属性
    3   
    4 @end

    ExtensionClass.m

     1 @interface ExtensionClass() //类的扩展(Extension)
     2 @property (retain, readwrite) float value; //1、声明私有可读写属性;而在类的声明中是同名的公开只读属性
     3    
     4 - (void)privateMethod; //2、声明私有方法  
     5 @end   
     6    
     7 @implementation ExtensionClass //类的实现
     8    
     9 // 实现声明在头文件或父类中的公开方法,或者声明在扩展中的私有方法  
    10 - (void)privateMethod {   
    11     // implement private method here;   
    12 }   
    13    
    14 @end

    Extension和Category看起来相似,其实不同

    由于Extension和Category的语法很相似,所以Extension常常被误解为一个匿名的Category,但是它们的目的和行为却是不同的。

  • 相关阅读:
    Django-haystack对接elasticsearch
    Django http 和 https 官网解答
    -bash: nohup: command not found
    Mysql 10060登录异常解决方法
    ssh
    sed grep awk用法
    grep用法
    shell 随笔
    列表生成式
    css
  • 原文地址:https://www.cnblogs.com/huangjianwu/p/4574035.html
Copyright © 2011-2022 走看看