iOS 属性

2021-04-01  本文已影响0人  Fat_Blog

@property

我们每次在增加一个属性,系统都会在ivar_list 中添加一个成员变量的描述,在method_list中增加settergetter 方法的描述,在属性列表中增加一个属性的描述,然后计算该属性在对象中的偏移量,然后给出 settergetter方法对应的实现,在setter 方法中从偏移量的位置开始赋值,在 getter 方法中从偏移量开始取值,为了能够读取正确字节数,系统对象偏移量的指针类型进行了类型强转.

@property (nonatomic, strong)UIView *bgView;

当使用@property声明一个bgView的属性时,在编译阶段,编译器会自动给对象bgView添加一个实例变量_bgView以及它的set方法和get方法

代码验证

#import "ViewController.h"

#include <objc/runtime.h>

@interface ViewController ()

@property (nonatomic, strong)UIView *bgview;


@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    unsigned int count = 0;
    Ivar *varList = class_copyIvarList([self class], &count);
    for (unsigned int i = 0; i < count; i++) {
        const char *varName = ivar_getName(varList[i]);
        printf("成员变量-------%s\n",varName);
    }
    
    Method *methodList = class_copyMethodList([self class], &count);
    for (unsigned int i = 0; i < count; i++) {
        SEL methodName = method_getName(methodList[i]);
        NSLog(@"方法-------%@",NSStringFromSelector(methodName));
    
    }
}
@end

打印日志

成员变量-------_bgview
2021-03-31 19:19:40.612196+0800 basicLearn[12511:760231] 方法-------bgview
2021-03-31 19:19:40.612294+0800 basicLearn[12511:760231] 方法-------setBgview:
2021-03-31 19:19:40.612378+0800 basicLearn[12511:760231] 方法-------.cxx_destruct
2021-03-31 19:19:40.612465+0800 basicLearn[12511:760231] 方法-------viewDidLoad

@synthesize

代码展示

1.bgView是属性,而_bgView是成员变量
2.@synthesize bgView = _bgView; 这个方法是告诉编译器bgView属性是_bgView实例变量生成settergetter方法的实现

@interface ViewController ()

@property (nonatomic, strong)UIView *bgView;

@end

@implementation ViewController

@synthesize  bgView = _bgView;

- (void)setBgView:(UIView *)bgView {
    _bgView = bgView;
}
- (UIView *)bgView {
    return _bgView;
}

@dynamic

读写权限 readonly readwrite

@property (nonatomic, copy,readonly)NSString *str;

readonly可以应用在 父类的.h文件将属性设置为readonly,在.m文件又设置为readwrite,那么继承该父类的子类只能获取这个属性而不能修改它的值,只有父类才有权利去修改这个属性的值

原子性 nonatomic atomic

strong,weak,assign,retain,copy

strong 表示强引用,用于修饰NSObject对象,不能修饰基础数据类型,
strong修饰的对象被引用时 引用计数会➕1,当该对象的引用计数为0时,该对象会被释放掉

weak 表示弱引用,用于修饰NSObject对象,不能修饰基础数据类型,主要用于避免循环引用,要注意的是:weak修饰的对象才被初始化之后是会释放掉的,对象释放之后所有指向它的指针都会自动置为nil,这样可以防止野指针的问题

//bgView是weak修饰的
//这样初始化之后bgView就会被释放掉
self.bgView = [[UIView alloc]init];

assign 可以同时用来修饰基础数据类型(CGFloat等)和对象,当用assign修饰对象时,作用和weak相似,但是对象被释放之后,不会自动将属性置为nil,那么容易出现野指针的问题

copy 作用类似与strong,修饰NSObject对象,不能修饰基础数据类型,当copy修饰的属性是可变时(NSMutable),copy后的对象,会变成不可变对象,(比如从NSMutableArray变成NSArray,那么调用增删操作时会引发crash,因为尽量不要用copy修饰可变对象),指针地址跟之前是不一样的,也就是说会重新分配一块新的内存空间

一般用于MRC模式下,修饰对象引用计数会加1,后来在ARC模式下基本都使用strong了

上一篇下一篇

猜你喜欢

热点阅读