iOS开发技能回顾

深入理解OC中的属性

2019-10-24  本文已影响0人  猿人

深入理解OC中的属性

传统C++类实例变量写法

Person.h

#import <Foundation/Foundation.h>

@interface Person : NSObject
{
    @public               //声明为公有变量
    NSString * _name; 
    
    @private              //限制为私有变量,.m中默认类型
    NSString * _ID;
    
    @protected            //限制 子类访问变量,.h中默认类型
    NSString * _surname;
    
    @package              // 包内变量,只能本框架内使用
    NSString * _house;
    
}
 @end
 

以上这种传统定义形式的缺点

  1. 每个变量都需要手动编写getter和setter方法,变量太多的时候 会写一堆getter setter方法。而oc中属性变量的封装出现就是为了减少此工作以及代码冗余。

  2. 这种写法属于‘硬编码’,对象内部的变量定义布局已经写死了编译期,编译后不可再更改,否则会出错,因为编译前 被编译器定义为距对象初始指针地址的偏移量,编译之后变量是通过地址偏移来寻找。如果想在类中插入新的变量,那么必须要重新编译计算每个变量的偏移量,否则就会读取错误。

属性变量封装定义
  1. 存取方法和变量名自动合成
    使用OC的属性编译器会严格生成存取方法,通过.语法访问变量的存取方法,(编译器会将.语法转换成存取方法的调用)为了区分实际的变量名在前面加下划线,另外虽然默认加下划线 但是可以通过关键字@synthesize自定义实际的变量名

  2. 旧版编译器 可能 @property 和@synthesize 是成对出现 因为以前不不会自动生成 setter getter方法

  1. @dynamic 禁止自动生成 存取方法

  2. 通过@property 后的括号内也可以进行限制

#import <Foundation/Foundation.h>
 
@interface Person2 : NSObject
 
//只读  
@property (nonatomic,copy,readonly) NSString *name1;

@end

5.类主要的属性参数

原子性语义 atomic 、 nonatomic
读写语义 readwrite、readonly 、getter、setter
内存管理语义 assing 、weak 、unsafe_unretained、retain、strong 、copy
上一篇 下一篇

猜你喜欢

热点阅读