block要用copy修饰,还是用strong

栈区与堆区

block本身是像对象一样可以retain,和release。但是,block在创建的时候,它的内存是分配在栈(stack)上,而不是在堆(heap)上。他本身的作于域是属于创建时候的作用域,一旦在创建时候的作用域外面调用block将导致程序崩溃。
使用retain也可以,但是block的retain行为默认是用copy的行为实现的,

因为block变量默认是声明为栈变量的,为了能够在block的声明域外使用,所以要把block拷贝(copy)到堆,所以说为了block属性声明和实际的操作一致,最好声明为copy。

https://blog.csdn.net/www9500net_/article/details/52397873

原文地址:https://www.cnblogs.com/feng9exe/p/9215122.html

时间: 2024-11-10 07:25:06

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

iOS内存管理(4)--Block属性用copy修饰 & 避免循环引用的问题

一.Block的类型 根据Block在内存中的位置分为三种类型NSGlobalBlock,NSStackBlock, NSMallocBlock. NSGlobalBlock:类似函数,位于text段: NSStackBlock:位于栈内存,函数返回后Block将无效: NSMallocBlock:位于堆内存. 二.Block的copy.retain.release操作 不同于NSObjec的copy.retain.release操作: Block_copy与copy等效,Block_relea

关于NSArray使用时用strong修饰还是copy修饰问题测试

大家都知道,使用NSMutableArray时是用strong修饰,例如: [objc] view plain copy @property (nonatomic,strong) NSMutableArray * mutableArray; 但是,NSArray呢?我看大多数人都直接使用strong,而且网上还有很多人说除了NSString用copy,其他对象类型都用strong. 那么,问题来了:当用strong修饰NSArray的时候,如果遇到用可变数组给它赋值怎么办?会导致意料之外的bug

iOS之NSString类型为什么要用copy修饰

在开发的过程中,只知道NSString类型最好用copy修饰而不能用strong,但是不知道为什么,今天了解了下,总算搞明白了. 如下所示,当修饰符为copy时,因为NSMutableString是NSString类型的子类,所以可以用指针self.name指向mStr,但是我们知道copy的含义是指当重新赋值时深拷贝新对象再赋值给self.name, 所以此时self.name的指针和mStr的指针指向的对象就不同了,所以当给mStr对象发送方法appendString的时候,修改的只是mSt

IOS 关于NSString类型的属性为什么有时用copy,有时用strong呢?

对于很多初学者,发现在修饰NSString类型的对象时,会有这样的疑惑?怎么有些人用strong修饰,而有些人用copy修饰呢? 这里有个例子,一.首先声明2个属性: @property (nonatomic,copy) NSString *CopyName; @property (nonatomic,strong) NSString * StrongName; 1.1.创建一个可变字符串,方面后面作变化更改. NSMutableString* MutableName = [NSMutableS

NSString用copy修饰的原因

一言以蔽之:为了安全! 当一个可变字符串(NSMutableString)赋值给一个字符串属性(无论这个字符串是NSString还是NSMutableString), 如果此属性是retain修饰的,就是浅拷贝,引用计数加1.赋值后源字符串改变,这个属性值也跟着改变. 如果此属性是copy修饰的,就是深拷贝,引用计数等于1(因为从堆里新分配一个内存块).赋值后源字符串改变,这个属性值不会改变.(保证了安全) 假设对象有下面4个属性: 1 @property (retain, nonatomic)

【iOS开发-117】block为什么用copy?利用runtime运行时的objc_方法为分类扩充成员变量

(1)block - (void)viewDidLoad { [super viewDidLoad]; __block int a=10; NSLog(@"a=%d",a); void (^blockName)()=^{ a=20; }; NSLog(@"a=%d",a); blockName(); NSLog(@"a=%d",a); } --以上输出结果是10,10,20. --只要在变量前面增加__block,在block里面就可以修改该变量

NSString为何要用copy修饰,而不是strong?

NSString本身是无所谓的,但是如果一个 NSString 指针指向了一个 NSMutableString的内存空间的话,如果使用 strong 修饰的话,如果你在别处修改这个值的话,那么原来的值也会改变.用 copy 是生成了一份新的内存空间,所以原值不会改变. 所以用copy是为了安全,防止NSMutableString赋值给NSString时,前者修改引起后者值变化而用的.

NSString NSMutableString copy mutableCopy retain weak strong

NSString 与 NSMutableString NSString是不可变字符串对象,这句话的意思,结合代码: #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { NSString *str = @"Shaw"; NSString *str1 = @"Root"; // NSString *str1的意思是str1

IOS编程学习(2):copy,nonatomic, retain,weak,strong用法

property属性? property:提供成员变量的访问方法的声明.控制成员变量的访问权限.控制多线程时成员变量的访问环境 .property不但可以在interface,在协议protocol.和类别category中也可以使用. synthesize 合成访问器方法? 实现property所声明的方法的定义.其实说直白就像是:property声明了一些成员变量的访问方法 ,synthesize则定义了由property声明的方法.他们之前的对应关系是  property 声明方法 ---