解析Obj-C中的assgin,copy,retain关键字的含义。

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 解析Obj-C中的assgin,copy,retain关键字的含义。

在objc中引入了引用计数的概念Referenc e counting,当一个对象的计数为0时由系统负责释放对象的内存,每多一次对象引用计数就会加1.

retain:对一个对象引用加1


relese:引用减1


assign:对于非NSObject类型的对象赋值通常采用assign(简单赋值,不更改计数)例如:NSInteger,float,double,char等。


【ARC】


ARC自动引用计数:引入了新的对象生命周期限定(零弱引用:计数为0时自动设置为nil,防止了野指针),新加了strong和weak关键字。strong代替retain,weak代替assign。


weak声明一个当对象消失后指针可以自动设置为nil的对象。


readonly:表示对象是只读的,即仅实现getter操作。


readwrite:可供访问getter,setter


注:self.name=@"hello"和name="hello"的区别是:


1.self.name调用了setName方法,引用会加1.


2.name是直接赋值,引用不变


nonatomic:非原子操作(原子操作主要用在线程之间同步,原子操作是不可拆分的)


atomic:原子操作


【浅拷贝/深拷贝】


copy:对象拷贝,建立一个相同的对象,旧对象不变。不同的地址,但是数据相同,初始计数为1。


mutablecopy:同样是拷贝,只不过复制的是mutable类型的对象例如:NSMutableString。


具体区别:


1.对于非容器类对象:NSString等。


copy是浅拷贝,只复制指针,地址不变(浅拷贝)。mutablecopy是真正的内存复制(深拷贝)。


2.对于容器类对象:NSMutableString等


copy和mutablecopy都是内存复制(深拷贝),但是copy出来的对象不可增加。


但是对于NSArray和NSMutableArray对象来说,copy和mutablecopy都只是复制Array对象,但是对于Array内的内容对象来说并没有复制内存。如果要想实现NSMutableArray的完全拷贝就要用下面的代码,看例子:


NSArray *array = [[NSArray alloc]initWithObjects:[NSMutableString stringWithString:@"one1"],@"two2"];
NSArray *arrayCopy = [[NSArray alloc]initWithArray:array copyItems:YES];
NSArray *arrayDeepCopy = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:array]];


对于arrayCopy而言:@“one1”是内存赋值了,可@“two2”却没有内存赋值还是指针拷贝。只有arrayDeepCopy才是真正的完全内存复制。新的arryDeepCopy内的所有内容对象都是新的内存。


》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》


另一个问题:如何对自定义的对象使用copy和mutablecopy呢?


答:只用自己实现:copyWithZone或mutableCopyWithZone函数就可以使用copy或mutableCopy了。

@interface MyObj : NSObject<NSCopying,NSMutableCopying>
{
         NSMutableString *name;
         NSString *imutableStr;
         int age;
}
@property (nonatomic, retain) NSMutableString *name;
@property (nonatomic, retain) NSString *imutableStr;
@property (nonatomic) int age;
@end
@implementation MyObj
@synthesize name;
@synthesize age;
@synthesize imutableStr;
- (id)init
{
         if (self = [super init])
         {
                   self.name = [[NSMutableString alloc]init];
                   self.imutableStr = [[NSString alloc]init];
                   age = -1;
         }
         return self;
}
- (void)dealloc
{
         [name release];
         [imutableStr release];
         [super dealloc];
}
- (id)copyWithZone:(NSZone *)zone
{
         MyObj *copy = [[[self class] allocWithZone:zone] init];
         copy->name = [name copy];
         copy->imutableStr = [imutableStr copy];
//       copy->name = [name copyWithZone:zone];;
//       copy->imutableStr = [name copyWithZone:zone];//
         copy->age = age;
         return copy;
}
- (id)mutableCopyWithZone:(NSZone *)zone
{
         MyObj *copy = NSCopyObject(self, 0, zone);
         copy->name = [self.name mutableCopy];
         copy->age = age;
         return copy;
}
相关文章
|
10月前
|
架构师 安全 Java
资深架构师带你解析Synchronize关键字原理
众所周知 Synchronize 关键字是解决并发问题常用解决方案,有以下三种使用方式:
68 0
|
10月前
|
存储 Java 中间件
《吊打面试官系列》从源码全面解析 ThreadLocal 关键字的来龙去脉
《吊打面试官系列》从源码全面解析 ThreadLocal 关键字的来龙去脉
|
3月前
|
存储 缓存 Java
Java 并发编程——volatile 关键字解析
本文介绍了Java线程中的`volatile`关键字及其与`synchronized`锁的区别。`volatile`保证了变量的可见性和一定的有序性,但不能保证原子性。它通过内存屏障实现,避免指令重排序,确保线程间数据一致。相比`synchronized`,`volatile`性能更优,适用于简单状态标记和某些特定场景,如单例模式中的双重检查锁定。文中还解释了Java内存模型的基本概念,包括主内存、工作内存及并发编程中的原子性、可见性和有序性。
Java 并发编程——volatile 关键字解析
|
3月前
|
安全 编译器 C++
C++ `noexcept` 关键字的深入解析
`noexcept` 关键字在 C++ 中用于指示函数不会抛出异常,有助于编译器优化和提高程序的可靠性。它可以减少代码大小、提高执行效率,并增强程序的稳定性和可预测性。`noexcept` 还可以影响函数重载和模板特化的决策。使用时需谨慎,确保函数确实不会抛出异常,否则可能导致程序崩溃。通过合理使用 `noexcept`,开发者可以编写出更高效、更可靠的 C++ 代码。
80 1
|
3月前
|
Java 程序员
面试官的加分题:super关键字全解析,轻松应对!
小米,29岁程序员,通过一个关于Animal和Dog类的故事,详细解析了Java中super关键字的多种用法,包括调用父类构造方法、访问父类成员变量及调用父类方法,帮助读者更好地理解和应用super,应对面试挑战。
65 3
|
7月前
|
网络协议 Java 数据库连接
13 Java异常(异常过程解析、throw、throws、try-catch关键字)
13 Java异常(异常过程解析、throw、throws、try-catch关键字)
166 2
|
9月前
|
存储 Java 数据库
Static关键字在Java中的多种用途解析
Static关键字在Java中的多种用途解析
|
9月前
|
JavaScript 前端开发 开发者
JavaScript中的const关键字解析
JavaScript中的const关键字解析
|
8月前
|
存储 C语言
C语言中static关键字的作用与用法解析
C语言中static关键字的作用与用法解析
|
8月前
|
存储 Java 数据库
Static关键字在Java中的多种用途解析
Static关键字在Java中的多种用途解析

热门文章

最新文章

推荐镜像

更多