block要用copy修饰,还是用strong】的更多相关文章

栈区与堆区 block本身是像对象一样可以retain,和release.但是,block在创建的时候,它的内存是分配在栈(stack)上,而不是在堆(heap)上.他本身的作于域是属于创建时候的作用域,一旦在创建时候的作用域外面调用block将导致程序崩溃.使用retain也可以,但是block的retain行为默认是用copy的行为实现的, 因为block变量默认是声明为栈变量的,为了能够在block的声明域外使用,所以要把block拷贝(copy)到堆,所以说为了block属性声明和实际的…
又是一个老生常谈的话题,可是貌似这个问题,好多ios开发工程师并不能理解透彻,所以简单记录分析一下深复制与浅复制的原理以及strong,copy修饰符的原理和使用.   一.深复制与浅复制       1.区分深复制与浅复制其实很简单,最直观的一点就是是否创建了新的对象(或者说副本).(这里说的是内容是否被copy).浅复制只是引用计数加一,没有创建新的对象:深复制直接把内容复制,创建了新的对象.     2.不同情况下的copy和mutablecopy是否会创建新的对象         1>深…
简单来说,block就像一个函数指针,指向我们要使用的函数. 就和函数调用一样的,不管你在哪里写了这个block,只要你把它放在了内存中(通过调用存在这个block的方 法或者是函数),不管放在栈中还是在堆中,还是在静态区.只要他没有被销毁,你都可以通过你声明的block调 用他. 说到在类中声明一个block为什么要用copy修饰的话,那就要先说block的三种类型. 1._NSConcreteGlobalBlock,全局的静态block,不会访问外部的变量.就是说如果你的block没有调用其…
一.NSMutableArray 被copy.strong修饰后的变化: 把NSMutableArray用copy修饰有时就会crash,因为对这个数组进行了增删改操作,而copy后的数组变成了不可变数组NSArray,没有响应的增删改方法,所以对其进行增删改操作就会报错. 举例如下: (1)copy: @property (nonatomic, copy  ) NSMutableArray *a; NSMutableArray* b = [NSMutableArray array]; a =…
在完成项目期间,不可避免的会使用到block,因为block有着比delegate和notification可读性更高,而且看起来代码也会很简洁.于是在目前的项目中大量的使用block. 之前给大家介绍了一下在开发的过程中使用到了代理以及block,并详细的介绍了一下delegate和block的相似之处.(如有兴趣可以去看我之前的文章         链接: http://www.cnblogs.com/MasterPeng/p/5210263.html) 主要是因为在开发的时候,有时候由于疏…
iOS 杂笔-25(不要用copy修饰NSMutableString) 首先对题目进行简单的解释,我所说的不要用copy修饰NSMutableString不是说完全不可以用.但是要清楚一点,既然使用NSMutableString就是想应用它的可变属性,然而当我们用copy修饰NSMutableString后当我们实例化时,生成的是不可变的,当我们第一次使用可变操作时程序会崩溃,因此说不要用copy修饰NSMutableString,与其同理的还有可变数组等.下面是验证操作. 用copy修饰NSM…
对于很多初学者,发现在修饰NSString类型的对象时,会有这样的疑惑?怎么有些人用strong修饰,而有些人用copy修饰呢? 这里有个例子,一.首先声明2个属性: @property (nonatomic,copy) NSString *CopyName; @property (nonatomic,strong) NSString * StrongName; 1.1.创建一个可变字符串,方面后面作变化更改. NSMutableString* MutableName = [NSMutableS…
出题者简介: 孙源(sunnyxx),目前就职于百度 整理者简介:陈奕龙,目前就职于滴滴出行. 转载者:豆电雨(starain)微信:doudianyu 若想令自己所写的对象具有拷贝功能,则需实现 NSCopying 协议.如果自定义的对象分为可变版本与不可变版本,那么就要同时实现 NSCopying 与 NSMutableCopying 协议. 具体步骤: 需声明该类遵从 NSCopying 协议 实现 NSCopying 协议.该协议只有一个方法: - (id)copyWithZone:(N…
在开发的过程中,只知道NSString类型最好用copy修饰而不能用strong,但是不知道为什么,今天了解了下,总算搞明白了. 如下所示,当修饰符为copy时,因为NSMutableString是NSString类型的子类,所以可以用指针self.name指向mStr,但是我们知道copy的含义是指当重新赋值时深拷贝新对象再赋值给self.name, 所以此时self.name的指针和mStr的指针指向的对象就不同了,所以当给mStr对象发送方法appendString的时候,修改的只是mSt…
NSString本身是无所谓的,但是如果一个 NSString 指针指向了一个 NSMutableString的内存空间的话,如果使用 strong 修饰的话,如果你在别处修改这个值的话,那么原来的值也会改变.用 copy 是生成了一份新的内存空间,所以原值不会改变.   所以用copy是为了安全,防止NSMutableString赋值给NSString时,前者修改引起后者值变化而用的.…
在IOS开发中,经常会使用   @property(nonatomic,copy)NSString * name;   语句来快速设置set get 方法,在此依次说明atomic .nonatomic.copy .retain的作用         atomic 和 nonatomic 用来决定编译器生成的 getter和  setter  是原子操作还是非原子操作.         atomic 设置成员变量的@property属性时,默认为atomic,即原子操作,对同一对象的set和ge…
block:本质就是一个object-c对象block:存储位置,可能分为3个地方:代码去,堆区.栈区(ARC情况下会自动拷贝到堆区,因此ARC下只能有两个地方:代码去.堆区)代码区:不访问栈区的变量(如局部变量),且不访问堆区的变量(alloc创建的对象),此时block存放在代码去.堆区:访问了处于栈区的变量,或者堆区的变量,此时block存放在堆区.–需要注意实际是放在栈区,在ARC情况下会自动拷贝到堆区,如果不是ARC则存放在栈区,所在函数执行完毕就会释放,想再外面调用需要用copy指向…
// // Person.h #import <Foundation/Foundation.h> typedef void (^myBlock)(); @interface Person : NSObject //@property (nonatomic, retain) NSString *name; @property (nonatomic, copy) NSString *name; // 注意: 如果是block使用copy并不是拷贝, 将pBlock所指向的代码块从栈转移到堆中.bl…
copy retain assign的差别在于对象属性的set方法 NSString 与 NSMutableString NSString是不可变字符串对象,这句话的意思,结合代码: #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { NSString *str = @"Shaw"; NSString *str1 = @"Roo…
   前些日子笔者一直在维护公司的一些旧项目,项目里面的NSString属性几乎全部用的strong,而我在给项目增加一些新的功能的,又都用的copy,因为在我的脑子里几乎已经把NSString大部分用copy当做了习惯,正好某日给团队元老看到了,与之交流时谈到他说NSString一般都用strong就可以了,一般不会有被外界修改的安全性问题.        然而,我已经习以为常用copy,要强行改过来是一件很蛋疼的事,那当时又正因为是习以为常,所以也没能很好的说出个所以然来,让他觉得确实该用c…
1.block是一个特殊的oc对象,建立在栈上,而不是堆上,这么做一个是为性能考虑,还有就是方便访问局部变量. 2.默认Block使用到的局部变量会被copy,而不是retain.所以,他无法改变局部变量的值.如果在变量前加上__block那么编译器不会复制变量,而是去找变量的地址,通过地址来访问变量,实际上就是直接操作变量. 3.另外block是在栈上分配的,所以一旦离开作用域,就会释放.因此要把block用在别处时,必须要copy一份.block不能保留,retain没有意义.待续...…
 readwrite 是可读可写特性;需要生成getter方法和setter方法时  readonly 是只读特性 只会生成getter方法 不会生成setter方法 ;不希望属性在类外改变  assign 是赋值特性,setter方法将传入参数赋值给实例变量;仅设置变量时;  retain 表示持有特性,setter方法将传入参数先保留,再赋值,传入参数的retaincount会+1;  copy 表示赋值特性,setter方法将传入对象复制一份;需要完全一份新的变量时.  nonatomic…
- (void)fun{  NSString* str = [[NSString alloc] initWithString:@"string"];  NSLog(@"%d", [str retainCount]);}可以看到 str的计数器为-1 而把initWithString换成initWithFormat 计数器就是1 ------解决方案--------------------------------------------------------没有区别…
因为公司开启了一个新的iOS项目, 所以近期比较忙, 没有更新博客,今天打算总结一下关于UI布局及屏幕适配的一些实战技巧,尤其使用纯代码,会对提升效率及代码易于维护等方面有明显帮助,这里提到的没有使用任何Xib, 如果不是在外包公司,也推荐大家多使用甚至完全使用纯代码布局UI,优缺点下面会说明,本文布局使用masonry.货不太干,只是工作中的一点点小技巧与基础知识,大家可以来分享更多的技巧. 下篇地址:http://www.jianshu.com/p/0c1d76e7ea1a 提纲: 1. 关…
总结一下关于UI布局及屏幕适配的一些实战技巧,尤其使用纯代码,会对提升效率及代码易于维护等方面有明显帮助,这里提到的没有使用任何Xib, 如果不是在外包公司,也推荐大家多使用甚至完全使用纯代码布局UI,优缺点下面会说明,本文布局使用masonry. 提纲: 1. 关于xib/storyboard 与 纯代码的对比 2. 一条规范(又提了一点关于命名的) 3. UI工厂类 与 代码块 4. 懒加载, View使用strong还是weak 5. 复杂界面要会分区,要会障眼法 6. masonry均布…
问题 在调试程序时,我从ViewController A push进 ViewController B,在从B back时发现程序不会执行B里面的dealloc(),很诡异的问题,因为按理说此时点击back是执行pop操作的,是会执行dealloc()函数的,但经调试发现确实没有执行.所以viewController也就不会销毁. 原因 The dealloc method was not being called if any of the references held by a viewc…
身边一同事,我印象在过去三个月,有两次因为使用“copy”修饰UIKit控件的属性,导致程序崩溃.他还一本正经的说我以前一直使用copy. 好了,到这里我们就不得不说说什么时候使用copy.我的印象中,只有两处使用了copy,即修饰NSString类型与block,其他的都是使用strong关键字修饰. 说到这里,我们先来说说NSString类型,我在创建的NSString类型的属性中,也曾也使用过strong修饰的,因为我几乎没有使用过NSMutableString类型转换,我不用去考虑是用c…
时不时会有点迷惑属性修饰符retain.strong.copy三者之间的区别,还是把测试过程记录下来好一点! 1.属性修饰符结论 2.给retain.strong.copy修饰的字符串属性赋值指针变化测试例子 3.字符串调用copy.mutableCopy方法给字符串赋值指针变化例子 一.属性修饰符retain.strong.copy修饰字符串测试 先看代码,创建一个Person类,定义属性 #import <Foundation/Foundation.h> @interface Person…
iOS中copy和strong修饰符的区别 //用copys修饰的生成的都是不可变的对象 ,如果调用可变类型方法的直接报错 @property(nonatomic,copy)NSString * cpStr; @property(nonatomic,strong)NSString *strongStr; 1.当copy的对象类型为不可变对象如NSString类型时,和Strong修饰作用是一样的 NSString *str = @"wxwx"; self.cpStr = str; se…
1.NSString类型的属性为什么用copy NSString类型的属性可以用strong修饰,但会造成一些问题,请看下面代码 #import "ViewController.h" @interface ViewController () @property(nonatomic,strong) NSString *nameStrong; @property(nonatomic,copy) NSString *nameCopy; @end @implementation ViewCon…
• copy: 用于希望保持一份传入值的拷贝,而不是值自身的情况,即把原来的对象完整的赋值到另外一地方,重新加载一内存区,一个地方变了不影响另一个地方的对象. • assign:  简单的直接赋值,相当于说两个对象指向同个内存区,一个地方的变了,其他的也跟着改变. • retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数 为1 那上面的是什么意思呢? Copy 其实是建立了一个相同的对象,而 retain 不是: 比如一个 NSString 对象,地址为 0×1111,…
想必很多开发人员知道一般用copy修饰block,接下来就讲解为什么需要用copy,甚至会讲到其实用strong修饰block也是可以的 在 Objective-C 语言中,一共有 3 种类型的 block: _NSConcreteGlobalBlock 全局的静态 block,不会访问外部局部变量(显然包括无外部变量或者全局变量). _NSConcreteStackBlock 保存在栈中的 block,当函数返回时会被销毁. _NSConcreteMallocBlock 保存在堆中的 bloc…
关键词assign.strong.copy.weak.unsafe_unretained 影响: 是否开辟新的内存 是否有引用计数增加 strong 指向并拥有该对象.其修饰的对象引用计数会 +1,该对象只要引用计数不为 0 就不会销毁,置为 nil 可以销毁它.一般用于修饰对象类型.字符串.集合类的可变版本NSMutable. // .h 文件 @property (nonatomic, strong) NSMutableArray * nArr; // .m 文件 { NSMutableAr…
1. Block的声明和线程安全Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的,可以参考之前的文章(iOS: 非ARC下返回Block).另一个需要注意的问题是关于线程安全,在声明Block属性时需要确认“在调用Block时另一个线程有没有可能去修改Block?”这个问题,如果确定不会有这种情况发生的话,那么Block属性声明可以用nonatomic.如果不肯定的话(通常情况是这样的),那么你首先需要声明Block…
一.atomic与nonatomic 1.相同点 都是为对象添加get和set方法 2.不同点 atomic为get方法加了一把安全锁(及原子锁),使得方法get线程安全,执行效率慢 nonatomic没有添加安全锁,执行效率快 一般iOS程序中,所有属性都声明为nonatomic.这样做的原因是:在iOS中使用同步锁的开销比较大, 这会带来性能问题.一般情况下并不要求属性必须是"原子的",因为这并不能保证"线程安全"(thread safety),若要实现&quo…