标题:OC1:通过类别扩展类的属性(实例变量)
内容:
在Objective-C中,大家基本上都认为类别是可以扩充已有类的方法,不能扩充已有类的属性(实例变量),但事实上经过我若干次的研究,得出,其实类别也可以扩充已有类的属性的,具体方法和局限如下:
结论:OC1-1:当类别的名字不为空时,有以下情况:
- 类别的接口中不能声明属性;
- 类别的接口中可以使用 “@property”,但调用时会出错;
- 类别的实现文件中不能使用 “@synthesize”;
结论:OC1-2:当类别的名字为空时,没有类别名字时,具有以下情况:
- 在实现区域类别名字不能为空,即没有名字的类别不能有@implementation部分,但没有名字的类别的实现可以写在类别的原类中的实现(@implementation)区域;
- 接口文件中可以声明新属性、方法,也可以使用“@property”;
- 没有类别名字的类别中声明的属性是私有的,但类别所定义的同级类可以直接使用该变量,其子类及其它类不能直接使用;
- 其子类若想使用该变量,可以通过方法间接使用该变量,也可以利用”@property”或者”@synthesize”的点运算符来使用该变量;但是,”@synthesize”仍然要在原类的实现区域中使用;
标题:OC2:Objective-C中区块(或称为block,或称为团包等等)的相关规则解读
内容:
因为执行区块的地方并不是在定义区块的地方,它可能在另一个函数的内部,或者作为返回值被在调用函数体内赋值后执行区块,所以,当区块执行时,区块内所涉及的不是在区块内定义的变量可能已经随着定义区块的函数的结束而被销毁,为了保证区块在执行时能够引用区块中所用到的任意量的值,所以区块对不是在区块定义的变量的使用使用了以下方案:
- 区块会对于自动变量在区块定义处的值作为常量获取;
- 因为静态变量不会被释放,区块会将其作为变量来对待;
- __block关键字不能声明变长数组和包含变长数组的结构体,其原因也是因为:对于变长数组(例如:mutableArry[variable],variable是整型变量),变长批是的数组的元素个数是个变量,并非其包含的元素个数是可变的,所以,虽然variable是变量,但是在变长数组声明时variable的值已经是确定的,然而,如果用__block关键字定义变长数组 mutableArry[variable],则区块也会将variable也作为变量来对待,所以区块会在执行时查找varibale的值以便确认数组的长度,可是这时,variable的值可能已经不是数组mutableArry声明时的值了,所以可能会引起错误,所以,__block关键字不能声明变长数组和包含变长数组的结构体;
- 在区块中直接使用C语言数组,并不能很好的工作。原因如下:因为在区块中使用区块外的自动变量时,区块是先把自动变量捕获为自己的成员变量,然后在区块中创建与被捕获的自动变量的类型和名字一样的临时变量,然后把捕获的相应的成员变量赋值给刚创建的临时变量,但是,C语言数组不能直接赋值,所以C语言数组在种情况不能很好地工作;