weak和拷贝

weak/拷贝

1. weak

  • 只要没有strong指针指向对象,该对象就会被销毁

2. 拷贝

  • NSString和block用copy
  • copy语法的作用
    • 产生一个副本
    • 修改了副本(源对象)并不会影响源对象(副本)
  • 实现拷贝的方法
    • copy: 返回的是不可变副本

      • 可变字符串调用copy生成不可变的副本
      • 副本与源对象(不可变的)的地址相同
      • 自定义对象用copy即可(副本与源对象的地址不同),如果用strong则副本与源对象地址一样
      • copy内部会调用copyWithZone方法
      • 遵守NSCopying即可拥有copyWithZone方法
      • 在set方法中调用copy
重写copyWithZone:(NSZone *)zone方法
{
   类名 *对象名称 = [[类名 allocWithZone] init];
   /*给属性赋值*/
   return 对象名称;
}
- (void)set属性:(类名 *)参数名称
{
    _属性 = 参数;
}
+ mutablecopy: 返回可变副本
    * 副本与源对象地址不同

3. 浅拷贝和深拷贝

源对象类型 调用的拷贝方法 副本对象类型 是否产生了新对象 拷贝类型
NSMutableString copy NSString YES 深拷贝(内容拷贝)
NSMutableString mutablecopy NSMutableString YES 深拷贝(内容拷贝)
         
NSString copy NSString NO 浅拷贝(指针拷贝)
NSString mutablecopy NSMutableString YES 深拷贝(内容拷贝)
  • 普通对象实现拷贝的步骤 _ 遵守NSCopying协议

    • 实现-copyWithZone:方法

      • 创建新对象
      • 给新对象的属性赋值
时间: 2024-08-25 06:14:12

weak和拷贝的相关文章

assign,copy,strong,weak,nonatomic的具体理解

例子: NSString *houseOfMM = [[NSString alloc] initWithString:'MM的三室两厅']; 上面一段代码会执行以下两个动作:  1 在堆上分配一段内存用来存储@' MM的三室两厅 ' ,比如:内存地址为 0X1111  内容为 ' MM的三室两厅' ,  2 在栈上分配一段内存用来存储 houseForWife ,比如:地址为 0XAAAA  内容自然为 0X1111 下面分别看下(assign,retain,copy):  1.assign的情

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

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

【iOS面试系列-1】iOS中@property 后assign,copy,retain,weak,strong的意义与区别(必考-必须详细掌握)

来源:网络 assign: 普通(简单)赋值,一般常用于基本数据类型,常见委托设计模式,一次来防止循环引用.不更改索引计数(Reference Counting). 对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char, 等等) retain:保留计数,获得到了对象的所有权,引用计数在原有基础上+1.释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1 .我们给那块内存设一个引用计数,当内存被分配并且赋值给a时,引用

retain和strong、assign和weak的区别

IOS的对象都继承于NSObject, 该对象有一个方法:retainCount ,内存引用计数. 引用计数在很多技术都用到: window下的COM组件,多线程的信号量,读写锁,思想都一样. (一般情况下: 后面会讨论例外情况) alloc 对象分配后引用计数为1 retain 对象的引用计数+1 copy copy 一个对象变成新的对象(新内存地址) 引用计数为1 原来对象计数不变 release 对象引用计数-1 如果为0释放内存 autorelease 对象引用计数-1 如果为0不马上释

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

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

iOS strong与weak的使用

strong修饰的属性是强指针类型的,weak修饰的属性是弱指针类型的 ARC对于内存中的对象管理机制,当某个对象没有被强指针指向的时候,该对象就会被销毁. 所以不适当的使用strong和weak修饰属性容易造成内存泄露. OC对象(继承NSObject的类创建的对象)用strong修饰. UI控件连线的时候都会用weak修饰,给了大家一个假象.就是UI控件属性都是用weak修饰的.这种说法是错误的 当我们连线的时候,storyboard会根据图层结构分析,判断是否使用weak修饰,验证: 任何

属性设置@property之retain,assign,weak,strong,copy

1.assign assign只是简单赋值,不更改索引计数,适用于基础数据类型 (例如NSInteger,CGFloat)和C数据类型(int, float, double, char, 等) 2.copy copy用来建立一个索引计数为1的对象,然后释放旧对象, 常用语NSString ,指在赋值时使用传入值的一份拷贝. 3.retain retain用来释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1 对其他NSObject和其子类,对参数进行release旧值,再ret

ios中strong, weak, assign, copy

copy 和 strong(retain) 区别 1. http://blog.csdn.net/itianyi/article/details/9018567 大部分的时候NSString的属性都是copy,那copy与strong的情况下到底有什么区别呢? 比如: @property (retain,nonatomic) NSString *rStr; @property (copy, nonatomic)   NSString *cStr; - (void)test: { NSMutabl

UI-iOS开发中@property的属性weak nonatomic strong readonly等介绍

@property与@synthesize是成对出现的,可以自动生成某个类成员变量的存取方法.在Xcode4.5以及以后的版本,@synthesize可以省略. 1.atomic与nonatomicatomic:默认是有该属性的,这个属性是为了保证程序在多线程情况,编译器会自动生成一些互斥加锁代码,避免该变量的读写不同步问题.nonatomic:如果该对象无需考虑多线程的情况,请加入这个属性,这样会让编译器少生成一些互斥加锁代码,可以提高效率. 2.readwrite与readonlyreadw