Object-C 学习笔记 8 属性的方法

                                     Object-C 学习笔记  属性的方法

属性 语法 特点  四种常用属性

  • 1  赋值相关

       语法结构 为成员变量服务

       功能

           1 . 给现有的成员变量生成一对 get set 方法

           2.  如果没有声明对应的成员变量自动生成一个 _属性名 的私有成员变量( 受保护的)

        写法

           1. 声明成员变量              @property    实现中            synthesize

           2. 不声明成员变量 声明  @property    实现中   声明  synthsize = 新名字

           3  只声明                        @propert       最简单的

不管如何使用, 属性方法 都只是一个 标签 不是内存中的数据, 真正的数据 其实 保存在 成员变量中(我们定义的 或者 自动生成的 )

 

   属性关键字:

      下面括号 中的就是 属性关键字

       assign 默认关键字  或者 缺省关键字      基本数据 类型 的赋值

      @property(strong, nonatomic) NSString* name;     引用类型

      @property(assign, nonatomic) NSInteger weight;   值类型

 

       引用类型 区分 MRC ARC

                MRC  手动管理内存的时候的 属性关键字 retain   copy  

                          retain  对象属性声明   保留引用基数     (应用基数 +1)

                          copy   对象属性声明   重新拷贝一个新的副本

                ARC  自动管理内存的时候的 属性关键字 strong

                          strong 对象属性声明  强指针 (本质上 和 retain  类似 引用基数 +1)

                          weak  对象属性声明  不增加对象的 引用基数

    ARC 属性关键词 对 MRC 是兼容的 ,换句话说就是 在 ARC 也可以使用 MRC 属性关键字

    上面五种属性 关键字 同时只能出现一个

  •   总结:

  • 非对象类型  使用   assign  并且 可以缺省

  • 对象类型     使用   retain    或者 strong

  • NSString    使用   copy     或者 strong

//
//  main.m
//  属性和方法
//
//  Created by game912 on 2018/12/21.
//  Copyright © 2018年 john. All rights reserved.
//

#import 
#import "Person.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"Hello, World!");
        
    
//        Person* P1 = [Person new];
//        
//        [P1 name];
//        [P1 setName:@"大头"];
        
        Person* P1 = [Person new];
        P1.name = @"吃屎";
        NSLog(@"%@", P1.name );
    }
    return 0;
}
//
//  Person.h
//  属性和方法
//
//  Created by game912 on 2018/12/21.
//  Copyright © 2018年 john. All rights reserved.
//

#import 

@interface Person : NSObject
{
    NSInteger _age;
}
// 早期属性的用法
//第一种写法  三个步骤
// 1 声明一个变量         _age;
// 2 属性的声明          @property(assign, nonatomic) NSInteger age;
// 3 类的实现中          @synthesize age;
@property(assign, nonatomic) NSInteger age;//private 私有属性


// 早期属性的用法         自动生存一个 私有成员变量 _wight _属性名字
//第二种写法  二个步骤
// 1 属性的声明          @property(assign, nonatomic) NSInteger weight;
// 2 类的实现中          @synthesize weight;
// @synthesize weight = _myWeight; 这种方式 可以修改自动生成的变量名字
@property(assign, nonatomic) NSInteger weight;//private 私有属性



//属性 新的写法
//第三种写法 一个步骤
@property(strong, nonatomic) NSString* name;  //private 私有属性



@end

 

//
//  Person.m
//  属性和方法
//
//  Created by game912 on 2018/12/21.
//  Copyright © 2018年 john. All rights reserved.
//

#import "Person.h"

@implementation Person

@synthesize age;


@synthesize weight;
// @synthesize weight = _myWeight; //用于重命名

@end

  • 2  线程相关

   @property(assign, nonatomic) NSInteger weight;   值类型

   关键字  nonatomic  atomic 都是和线程相关

  •    nonatomic    单线程的程序的属性 声明   (缺省关键字  单线程下 使用的关键字) 执行效率比 atomic 高
  •    atomic          多线程的程序的属性  声明  (并不建议使用 atomic 处理线程 安全)

   这两个关键字 可以上面 赋值相关  关键字(5种)一起使用

 

  • 3 属性读取权限关键字

 

  •     readwrite  缺省权限        生成  get  set
  •     readonly                         只能生成  get

   可以和上面两种共存

  @property(assign, nonatomic, readonly) NSInteger weight;   值类型  

 

  • 4  方法名相关 重命名 setter  getter

  • @property(assign, nonatomic, setter = SETNAME getter=GETNAME) NSInteger weight;   值类型  
  • setter  重命名是要加 :的。要不然是 报错 getter 没有强行 :的要求

 

    

小结:

  •          Person* P1                = [Person new];
  •        
  •          [P1 name];                                              //属性的调用 get
  •          [P1 setName:@"大头"];                          //属性的调用 set
  •         
  •          Person* P1                 = [Person new];
  •          P1.name                     = @"吃屎";         
  •     
  •          P1.name  ==== >   实例.属性     点语法的本质是 属性的调用  等价于    [P1 setName:@""] 或者 [P1 name:@""] 

 

 

 

 

 

你可能感兴趣的:(Object-C,学习笔记)