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类。