张超超OC基础回顾_05 property修饰符,id类型,instancetype。。。

一、property

 如果给一个属性同时提供了getter/setter方法, 那么我们称这个属性为可读可写属性

 如果只提供了getter方法, 那么我们称这个属性为只读属性

 如果只提供了setter方法, 那么我们称这个属性为只写属性

 如果既没有提供getter也没有提供setter方法, 那么我们称这个属性为私有属性

 格式:

 @property(属性修饰符) 数据类型 变量名称;

@property(readwrite) int age;   // 可读可写的 ,不用写的  默认就是这
/*
 - (void)setHeight:(double)height;
 - (double)height;
 
 - (void)setHeight:(double)height;
 - (double)abc;
 */
@property(getter=abc) double height;

/*
 - (void)setWeight:(double)weight;
 - (void)tiZhong:(double)weight;
 */
@property(setter=tiZhong:) double weight;
// readonly: 代表只生成getter方法不生成setter方法
@property(readonly) NSString * name;

// 是否已婚
// 程序员之间有一个约定, 一般情况下获取BOOL类型的属性的值, 我们都会将获取的方法名称改为isXXX,这样方便沟通,可读性也好点
@property(getter=isMarried) BOOL married;

 二、id类型

这个会用就行了,一般是用于多态的时候,我也没乱用过,不然这玩意编译不报错,到时候不好找,直接拷贝概念了

/*
id是一个数据类型, 并且是一个动态数据类型
     既然是数据类型, 所以就可以用来
     1.定义变量
     2.作为函数的参数
     3.作为函数的返回值
     
     默认情况下所有的数据类型都是静态数据类型
     静态数据类型的特点: 
     在编译时就知道变量的类型, 
     知道变量中有哪些属性和方法
     在编译的时候就可以访问这些属性和方法, 
     并且如果是通过静态数据类型定义变量, 如果访问了不属于静态数据类型的属性和方法, 那么编译器就会报错
     
     动态数据类型的特点:
     在编译的时候编译器并不知道变量的真实类型, 只有在运行的时候才知道它的真实类型
     并且如果通过动态数据类型定义变量, 如果访问了不属于动态数据类型的属性和方法, 编译器不会报错
     
     id == NSObject * 万能指针
     id和NSObject *的区别: 
     NSObject *是一个静态数据类型
     id  是一个动态数据类型
*/
// 通过静态数据类型定义变量, 不能调用子类特有的方法
    // 通过动态数据类型定义变量, 可以调用子类特有的方法
    // 通过动态数据类型定义的变量, 可以调用私有方法
    
    // 弊端: 由于动态数据类型可以调用任意方法, 所以有可能调用到不属于自己的方法, 而编译时又不会报错, 所以可能导致运行时的错误
    // 应用场景: 多态, 可以减少代码量, 避免调用子类特有的方法需要强制类型转换
    id obj = [Person new];
    [obj sleep];
    [obj test];
    [obj eat];
    
    id obj2 = [Student new];
    [obj2 eat];
    [obj2 test];

    
    // 为了避免动态数据类型引发的运行时的错误, 一般情况下如果使用动态数据类型定义一个变量, 在调用这个对象的方法之前会进行一次判断, 判断当前对象是否能够调用这个方法
//    id obj = [Person new];
    id obj = [Student new];

  // 先判断一下
if ([obj isKindOfClass:[Student class]]) { // isKindOfClass , 判断指定的对象是否是某一个类, 或者是某一个类的子类 [obj eat]; }
原文地址:https://www.cnblogs.com/XXxiaotaiyang/p/4991407.html