iOS中属性@property中的关键字的使用说明

来源:互联网 发布:无经验淘宝客服简历 编辑:程序博客网 时间:2024/06/02 21:58

1.@property是什么

@property是声明属性的语法,它可以快速的为实例变量创建存取器,并且允许通过点语法使用存取器。
存取器:用于获取和设置实例变量的方法。getter是用于获取实例变量的存取器,setter是用于设置实例变量的存取器。

2.@property关键字使用说明

我们在iOS日常开发中经常会使用@property,其中我们经常使用assign,weak,strong,copy,nonatomic,atomic,readonly,readwrite,getter,setter等关键字,下面我们列个表格去归纳一下属性关键字具体作用

属性关键字的作用 属性关键字 作用 strong 在赋值时调用被指向对象的retain方法,使其引用计数加1 weak weak不增加对象的引用计数,也不持有对象,对象消失后,指针自动变成nil assign 不更改索引计数,使用基础数据类型(int float double等) copy 建立一个引用计数为1的对象,通常用于NSString和block atomic 原子操作,提供线程安全,默认是atomic的,耗费系统资源 nonatomic 非原子性操作,不提供线程安全,效率更高 readonly 属性只读 readwrite 属性可以读写,默认属性 unsafe_unretained 和weak类似,但是引用计数为0,变量不会置为nil getter 手动设置获取实例变量的方法 setter 手动设置设置实例变量的方法

3.通过一个实例学习

#import <Foundation/Foundation.h>@class Dog;@interface Person : NSObject@property (nonatomic, copy) NSString *mark;@property (nonatomic, strong) NSString *name;@property (nonatomic, strong) Dog *dog1;@property (nonatomic, weak) Dog *dog2;@end
#import <Foundation/Foundation.h>@interface Dog : NSObject@end

测试strong和weak的区别,dog1为strong,dog2为weak,分别将这两个置为nil,观察ben.dog1和ben.dog2的值。

Person *ben = [[Person alloc] init];Dog *dog1 = [[Dog alloc] init];ben.dog1 = dog1;Dog *dog2 = [[Dog alloc] init];ben.dog2 = dog2;NSLog(@"dog1=%@ dog2=%@", dog1, dog2);dog1 = nil;dog2 = nil;NSLog(@"ben.dog1=%@ ben.dog2=%@", ben.dog1, ben.dog2);

这里写图片描述

可以看出属性为strong指向的dog没有被释放掉,因为这个dog被ben.dog1强持有,引用计数加1,直接给dog1置为nil是不可以的。属性为weak的为弱持有,并没有增加引用计数。

NSMutableString *name = [@"ben" mutableCopy];NSMutableString *mark = [@"1111" mutableCopy];Person *ben = [[Person alloc] init];ben.name = name;ben.mark = mark;NSLog(@"name=%@ mark=%@", name, mark);[name appendString:@"Changed"];[mark appendString:@"Changed"];NSLog(@"ben.name=%@ ben.mark=%@", ben.name, ben.mark);

这里写图片描述
NSString一般用copy的主要是为了防止传入的NSMutableString更改使NSString造成影响,属性关键字为strong的name,传入的string更改后也更改了,属性关键字为copy的mark在传入的string更改后并没有更改,strong为强持有,指向了对象,并且使对象的引用计数+1,copy是复制对象,并不会对传入对象造成任何影响。

0 0
原创粉丝点击