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

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

retain:对一个对象引用加1

relese:引用减1

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

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

readwrite:可供访问getter,setter

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;
}
时间: 2024-10-10 02:45:33

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

iOS中assign、copy 、retain等关键字的含义

assign: 简单赋值,不更改索引计数copy: 建立一个索引计数为1的对象,然后释放旧对象 retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1 Copy其实是建立了一个相同的对象,而retain不是:比如一个NSString对象,地址为0×1111,内容为@"STR" Copy到另外一个NSString之 后,地址为0×2222,内容相同,新的对象retain为1, 旧有对象没有变化 retain到另外一个NSString之 后,地址相同(建立一个指

解析OBJ模型并将其加载到Unity3D场景中

??各位朋友,大家好,欢迎大家关注我的博客,我是秦元培,我的博客地址是http://qinyuanpei.com.今天想和大家交流的是解析obj模型并将其加载到Unity3D场景中,虽然我们知道Unity3D是可以直接导入OBJ模型的,可是有时候我们并不能保证我们目标客户知道如何使用Unity3D的这套制作流程,可能对方最终提供给我们的就是一个模型文件而已,所以这个在这里做这个尝试想想还是蛮有趣的呢,既然如此,我们就选择在所有3D模型格式中最为简单的OBJ模型来一起探讨这个问题吧! 关于OBJ模

copy, retain, assign , readonly , readwrite,strong,weak,nonatomic整理

copy:建立一个索引计数为1的对象,然后释放旧对象 对NSString对NSString 它指出,在赋值时使用传入值的一份拷贝.拷贝工作由copy方法执行,此属性只对那些实行了NSCopying协议的对象类型有效.更深入的讨论,请参考“复制”部分. retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1对其他NSObject和其子类对参数进行release旧值,再retain新值指定retain会在赋值时唤醒传入值的retain消息.此属性只能用于Objective

IOS 关键字self,super,copy, retain, assign , readonly , readwrite, nonatomic、 @synthesize、@property、@dynamic

IOS 关键字self,super,copy, retain, assign , readonly , readwrite, nonatomic.                     @synthesize.@property.@dynamic #synthesize关键字: 根据@property设置,自动生成成员变量相应的存取方法,从而可以使用点操作符来方便的存取该成员变量 . @implementation 关键字,表明类的实现 @end 结束 self 关键字 :类似于java中的t

(转)copy, retain, assign , readonly , readwrite,strong,weak,nonatomic整理

copy:建立一个索引计数为1的对象,然后释放旧对象 对NSString对NSString 它指出,在赋值时使用传入值的一份拷贝.拷贝工作由copy方法执行,此属性只对那些实行了NSCopying协议的对象类型有效.更深入的讨论,请参考“复制”部分. retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1对其他NSObject和其子类对参数进行release旧值,再retain新值指定retain会在赋值时唤醒传入值的retain消息.此属性只能用于Objective

assign/copy/retain/strong/weak/readyonly/readwrite/nonatomic/atomic

arc其实并不是所谓的垃圾回收机制,其实arc只是编译器的一种特性,编译器会在编译阶段插入相应的内存管理代码,以实现自动的内存管理,这样就减少了因为程序员的一时疏忽或者项目过大而失误从而造成内存泄露,因为是编译器自动完成的代码插入所以arc的效率要高于垃圾回收机制. 在arc机制下dealloc中会由编译器自动插入释放属性的代码因此也不需要手动调用[super dealloc],当然arc只能管理foundation层的对象对于core foundation层的变量需要程序员手动去释放或者使用桥

iOS-assign、copy 、retain等关键字的含义

iOS中assign.copy .retain等关键字的含义 assign: 简单赋值,不更改索引计数 copy: 建立一个索引计数为1的对象,然后释放旧对象 retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1 Copy其实是建立了一个相同的对象,而retain不是: 比如一个NSString对象,地址为0×1111,内容为@”STR” Copy到另外一个NSString之 后,地址为0×2222,内容相同,新的对象retain为1, 旧有对象没有变化 retai

iOS copy/retain/assign

1 深复制:内容拷贝,源对象和副本对象指的是两个不同的对象,源对象引用计数器不变,副本对象引用计数器为1 2 浅复制:指针拷贝,源对象和副本对象指的都是同一个对象,对象引用计数器+1,相当于retain 3 只有不可变对象创建不可变副本(copy)才是浅复制,其它的都是深复制 copy关键字的使用 平时我们使用对象之间的传值都是采用retain count +1的方式,这种方式的适用于当对象的某属性的值改变时,引用该对象的不同指针会同时改变,因为这两个指针指向的是同一个内存地址, 但如果需求是,

java中的数据结构[copy]

转自http://developer.51cto.com/art/201107/273003.htm java版数据结构与算法,希望对你有帮助. 线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中.本文试图通过简单的描述,向读者阐述各个类的作用以及如何正确使用这些类. Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set