zoukankan      html  css  js  c++  java
  • oc总结第四讲:属性

    一、学习属性我们首先要对属性有一个清晰地认识,什么是属性?属性和我们熟知的实例变量有用什么区别呢??

         实例变量和属性是一个包含关系,实例变量中包含属性,而属性是作为实例变量的子集
         这种情况是需要为您举例子的,比如 汽车 是一个类(一个集合)
          1.您指出了一辆特定的车(请注意,这里是指的单个的一辆车),那么这辆车属于 汽车 这个类,这辆车您就可以理解为是汽车这个类的实例变量(指出了一个例子,实例也可以叫做 对象 )
          2.而您可以看到这辆车的颜色、车轮、发动机等等的车身上的部件,我们就可以称这些部件为 属性。
          3.而汽车是如何发动的,如何跑的,关于这些 我们可以称作它们是这辆车的方法,当然所有的车都可以发动,都可以跑,所以这些方法也是属于汽车的这个类(集合的)
          如果用程序的角度编写的话,比如您设置了一个父类是NSObject的自定义类,就叫做Car
    那么这个Car中,您可以通过在头文件用@property或者大括号'{}'直接声明一些变量,比如颜色、厂家等等,这些用@property或者大括号声明的变量称作Car这个类的属性
    而您进入主程序,设置一个Car类的变量,并声明了一个内存空间给它
                                             Car * instanceCar = [[Car alloc]init];
    那么这个"instanceCar"就是一个 实例对象(也是一个变量),这个变量是属于Car这个类的,所以这个变量可以使用Car类中所有的属性,也就是说,您可以用instanceCar.某属性的方法直接为这些变量赋值,而赋值后instanceCar这个变量就是一个独一无二的变量,是一个已经具体化的汽车的例子,所以称作实例对象(变量).

    二、了解了什么是属性后,我们要学习为什么用属性?属性有什么作用?
          我们通过声明属性(@property)来摆脱繁琐的setter和getter方法的创建。@property声明与实现文件中的另一个声明@sythesize相结合,来完成setter和getter方法的创建。@property生成设置器和访问器方法的声明,@synthesize 生成设置器和访问器方法的实现。
    注意:只有当访问器不存在的时候, @synthesize才会自动生成访问器,所以,即使是使用 @synthesize声明了一个属性,你仍然可以实现自定义的getter和setter。
    属性是设置实例变量的方法,也是获取实例变量的方法。

    三、属性注意事项

     1、当属性名和成员变量名一样时,如果我们想保证成员变量有值,那么就需要在.m中加入@synthesize 变量名
     2、当属性名和成员变量名一样时,如果我们对成员变量的值不强求,但我们又想打印赋上的值,这时在.m里可以使用_属性名 或者 self.属性名
     3、当定义一个属性时,会首先查找是否有以_属性名命名的成员变量,如果有,则默认对其进行set和get,如果没有,则隐式生成以_属性名命名的变量
     4、当我们使用属性时,成员变量可以省略
    程序如下:
    #import <Foundation/Foundation.h>
    #import "Person.h"
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            Person *p = [[Person alloc] init];
            p.name = @"王三";//默认调用name的set方法
            NSLog(@"==%@",p.name);//默认调用get方法
            [p sayHi];
        }
        return 0;
    }
     1、当属性名和成员变量名一样时,如果我们想保证成员变量有值,那么就需要在.m中加入@synthesize 变量名
    #import <Foundation/Foundation.h>
    @interface Person : NSObject{
        NSString *name;//对应注意1
    }
    //属性的关键字,属性帮我们封装了set和get方法
    @property (nonatomic, strong) NSString *name;
    @property (nonatomic, assign) int a;
    -(void)sayHi;
    @end
     
    #import "Person.h"
    @implementation Person
    //@synthesize name;
    -(void)sayHi{
        NSLog(@"我是%@",name);
    }
    @end
     
    //2、当属性名和成员变量名一样时,如果我们对成员变量的值不强求,但我们又想打印赋上的值,这时在.m里可以使用_属性名 或者 self.属性名
    #import <Foundation/Foundation.h>
    @interface Person2 : NSObject{
        NSString *name;
    }
    @property NSString *name;
    -(void)sayHi;
    @end
     
    #import "Person2.h"
    @implementation Person2
    -(void)sayHi{
        NSLog(@"--%@",_name);
        NSLog(@"--%@",self.name);
    }
    @end
     
    //3、当定义一个属性时,会首先查找是否有以_属性名命名的成员变量,如果有,则默认对其进行set和get,如果没有,则隐式生成以_属性名命名的变量
    #import <Foundation/Foundation.h>
    @interface Person3 : NSObject{
        NSString *_nam8e;
    }
    @property NSString *name;
    -(void)sayHi;
    @end
     
    #import "Person3.h"
    @implementation Person3
    -(void)sayHi{
        NSLog(@"--%@",_name);
        NSLog(@"--%@",self.name);
    }
    @end
     
    //4、当我们使用属性时,成员变量可以省略
    #import <Foundation/Foundation.h>
    @interface Person4 : NSObject
    @property NSString *name;
    -(void)sayHi;
    @end
     
    #import "Person4.h"
    @implementation Person4
    -(void)sayHi{
        NSLog(@"--%@",_name);
        NSLog(@"--%@",self.name);
    }
    @end
    
    
  • 相关阅读:
    Android kotlin jsoup解析网页html代码
    Android kotlin 判断网络状态
    ASP.NET设计模式笔记1
    C# SMTP发送邮件
    SQL连接数和CPU使用情况查询
    Grafana笔记
    Docker笔记
    solidity学习(四)---storage和memory关键字
    e-book
    solidity学习(四)-- Require(), Assert(), Revert()的用法和区别
  • 原文地址:https://www.cnblogs.com/qing92/p/4934170.html
Copyright © 2011-2022 走看看