@synthesize Category Extension Inheritance

1. @synthesize

@property (strong, nonatomic, readonly) NSArray *selectArray

SDK高的版本不用实现 synthesize

@synthesize selectArray;  // 实现变量的setter和getter方法

@synthesize selectArray = _selectArray;

:(这个只是一个变量,你可以设置成___selectArray,系统默认为_propertyName),_selectArray变量的改变不收约束

readonly:屏蔽setter和getter方法

因为是selectArray 拥有readonly属性,self.selectArray无法修改值,但是可以用_selectArray可以修改值。 

@synthesize selectArray = _selectArray 这个写法只是让你把变量_selectArray跟selectArray属性指向同一个内存,而self.selectArray受到(strong, nonatomic, readonly)的约束,导致无法修改值,因为self.selectArray改变是通过setter和getter方法改变,setter和getter方法又受到(strong, nonatomic, readonly)的限制。

另外一点:

@interface ViewController (){

 NSString *city_name;

 NSString *city_province;

}

大括号括起来的是instance variable(实例变量),只是简单的数值,不能绑定get/set方法,不能自动retain/copy/atomic,就相当于一个简单的跟着instance走的局部变量。

2. Category

利用Objective-C的Runtime机制,Category提供了一种比继承(inheritance)更为简洁的方法来对class进行扩展,无需创建对象类的子类就能为现有的类添加新方法,可以为任何已经存在的class添加方法,包括那些没有源代码的类(如某些框架类)。

(1)无法向类中添加新的实例变量,类别没有位置容纳实例变量。

(2)名称冲突,即当类别中的方法与原始类方法名称冲突时,类别具有更高的优先级。类别方法将完全取代初始方法从而无法再使用初始方法。

3. Extension

(1)形式上来看,extension是匿名的category。

(2)extension里声明的方法需要implementation中实现,category不强制要求。

(3)extension可以添加属性(变量),category不可以。

注:平时在.m文件里声明私有变量和私有方法,其实就是用了Extension的属性

4. Inheritance

(1)编译器从上往下执行,所以在子类前面至少应该要有父类的声明;

(2)OC中不允许子类和父类拥有相同名称的成员变量名;

(3)OC中的子类可以拥有和父类相同名称的方法,在子类调用时,优先去自己的内部寻找,如果没有则一层一层的往上找;

(4)super关键字,在子类中重写方法时,可以让调用者跳过这一层而调用父类中的方法。

(5)OC语言是单继承语言。在OC语言中,基本上所有类的根类都是NSObject类。

你可能感兴趣的:(@synthesize Category Extension Inheritance)