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

1.@property是什么

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

2.@property关键字使用说明

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

属性关键字的作用
属性关键字作用
strong在赋值时调用被指向对象的retain方法,使其引用计数加1
weakweak不增加对象的引用计数,也不持有对象,对象消失后,指针自动变成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是复制对象,并不会对传入对象造成任何影响。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值