新浦京81707con > 功能介绍 > C的属性修饰符,iOS中几个小知识点整理

原标题:C的属性修饰符,iOS中几个小知识点整理

浏览次数:99 时间:2020-03-22

一、NSString用copy还是strong

先是看下copy修饰可变变量与不可变变量的区分:

copy修饰可变变量:在赋值指针的同时,也会复制指针指向的内存区域,是深拷贝。copy修饰不可变变量:等同于strong,增加引用计数,是浅拷贝。

同理,属性NSString,

  1. 当源字符串是NSString时,不管是strong照旧copy,属性的靶子都以指向源对象,copy操作是浅拷贝。
  2. 当源字符串是NSMutableString时,strong修饰 扩大了源字符串的援引计数,而copy修饰string字符串则是对源字符串举行了深拷贝,发生了新对象,且copy属性对象指向那几个新的靶子,那么些copy属性的类型始终为NSString,是不可变的,因为宣称的性子类型是NSString。

当大家注明NSString属性时,不期望它中途改换,所以超过二分之一情形下大家用copy修饰,幸免因为源字符串是可变字符串时对其举行改善。所以当用copy时,源字符串是可变字符串时,源字符串改造,copy属性不随着转移(它是贰个新的对象,新的内存地址)。

转自:http://blog.csdn.net/linyousong/article/details/50762199

iOS中定义属性@property需求属性修饰符。

二、assign和weak的区别

assign:只进行简单的赋值,没有其他操作。当assign指向的内存被释放时,不会自动赋值为nil,会发生野指针问题weak:arc模式下属性修饰符,当属性所指向的内存被释放时,自动置为nil,避免野指针的发生。arc模式下,指针变量一定要用weak修饰,基本数据类型及结构体类型用assign修饰。

在苹果引进了ARC之后,属性的也相呼应的增添了一部分修饰符。所以这里大家独家对MRC和ARC三种情景下的性质修饰符进行学习。其实重要的分别聚集在对指标生命周期举办描述的习性修饰符会有所分化而已。
一、存取类型
其他性质都足以证明为readwrite或readonly,且默许设置为readwrite。
readwrite:程序自动创造setter/getter方法。
readonly:程序之创立getter方法。

ARC环境下:修饰符assign、strong、weak、copy、readwrite、readonly、nonatomic、atomic。

三、单例相关

优点:只会创建四个对象,节约内部存款和储蓄器。何况相当的轻便被外边访谈。劣势:

  1. 二个类唯有叁个目标,大概会导致责任过多,违背了面向对象的十足职责标准。
  2. 单例未有抽象层,所以增加困难
  3. 无法过多成立单例,因为单例从创设到程序关闭会一贯存在,过多的单例会影响属性,浪费能源。

代码示例:

 (instancetype)sharedInstance{static dispatch_once_t once;static id sharedInstance;dispatch_once(&once,^{ sharedInstance = [[self alloc] init];});return sharedInstance;}

代码深入分析:sharedInstance证明为静态变量,静态变量所在的方法再次回到时,静态变量不会被释放。sharedInstance变量的开端值是nil,当程序第三回施行sharedInstance方法时会创设一个对象,并将新创制的靶子的地点赋值给sharedInstance变量。再度实施sharedInstance方法时,无论多少次sharedInstance变量照旧会针对最早这几个创立的指标。因为指向对象的sharedInstance变量是强援用的,况且程序恒久不会释放该变量,所以sharedInstance变量指向的目的也不会自由。

线程安全:dispatch_once保证程序在运营进度中只会被周转三遍,即使线程1施行了sharedInstance方法,成立了四个实例变量,线程2就不会再去实施dispatch_once里面包车型客车代码了,进而确认保障程序只会创设多个实例对象。

别的,还足以自定义setter/getter方法。
@propery(setter=setId,getter=getId) int id;

ARC自动的在适用的地点步向retain、release代码,管理内部存款和储蓄器。

四、ARC和MRC

MRC情形下编程时属性用retain和assign修饰,ARC时引进了strong和weak。ARC下,不显式钦赐其余性质关键字时,默许的重中之重字是atomic,readwrite,strong,assgin。ARC/MRC分别都以怎样进行内部存款和储蓄器管理的?

次第在运转进度中会成立大气的指标,在ObjC中指标存储在堆中,系统并不会自动释放堆中的内存,基本项目是由系统和谐管理的,放在栈上。固然一个指标成立并采取后并未拿走及时放出那么就会据有多量内存,内部存款和储蓄器的累积使得系统卡顿,以致被app杀死。

1.MRC碰着下:什么人创造,哪个人释放,什么人全数,哪个人释放,减弱了种种模块的逻辑耦合。与变量相关的内部存款和储蓄器管理有retain,release和autorelease。retain和release方法操作的是引用记数,当援引记数为零时,便自行释放内部存款和储蓄器。何况能够用NSAutoreleasePool对象,对走入自动释放池(autorelease调用)的变量进行田间管理,当drain时回收内存。

与品质相关的修饰符有标识符@property (nonatomic/atomic,retain/assign/copy, readonly/readwrite卡塔尔(قطر‎ Number* num;

  • nonatomic/atomic,表示该属性是不是是对四线程安全的,是还是不是使用线程锁,暗中认可为atomic,
  • retain/assign/copy,是关于对该属性的内部存款和储蓄器管理的。retain和copy都亟待手动释放,assign不会挑起引用计数的更换,因为它是平昔赋值,四个变量将针对同叁个内部存款和储蓄器地址,另一个变量在动用的时候,该变量无法扩充放飞。假如内部三个变量释放了,另三个变量将引起野指针难题。借使是主导数据类型,使用assign不会有标题。

2.ARC情形下:变量修饰符常用的是__strong和__weak。block中国化学工业进出口总企业解循环援引难题时常用那对修饰符。属性修饰符有property (nonatomic/atomic, assign/retain/strong/weak/unsafe_unretained/copy,readonly/readwrite卡塔尔(قطر‎强援引strong扩展对象的援引计数,纵然是弱援用,则将内部存款和储蓄器对象在系统中成立映射表,一旦内部存储器对象的援引计数为0,则将该内存对象的持有弱引用对象指针置为nil。

二、原子性
atomic:生成的setter/getter操作为原子性的操作,试行品质超级低(系统暗中认可卡塔尔(قطر‎。
noatomic:生成的setter/getter操作为非原子性的操作,实施质量较高。平时推荐手动设置为该属性。

一、属性修饰符对retainCount计数的震慑

1、alloc为对象分配内部存款和储蓄器,retainCount为1;
2、retain 1;
3、copy 三个指标形成另贰个对象,retainCount为1,原有对象计数不改变。
4、release 对象的引用计数-1;
5、autorelrase 对象的引用计数-1。

assign、retain、copy对应setter方法。

//assign
- (void)setTestObject:(id)newValue{
     testObject = newVale;
}
//retain
- (void)setTestObject:(id)newValue{
     if (testObject != newValue){
          [testObject release];
          testObject = [newValue retain];
     }
}
//copy
- (void)setTestObject:(id)newValue{
     if (testObject != newValue){
          [testObject release];
          testObject = [newValue copy];
     }
}

本文由新浦京81707con发布于功能介绍,转载请注明出处:C的属性修饰符,iOS中几个小知识点整理

关键词: 新浦京81707con 知识点 ios 几个

上一篇:iOS开发多线程篇,iOS之单例模式初探

下一篇:没有了