assign与weak,野指针

@property(nonatomic, assign) void(^block)();

- (void)viewDidLoad {
    [superviewDidLoad];
    int value = 10;
    void(^blockC)() = ^{
        NSLog(@"just a block === %d", value);
    };

NSLog(@"%@", blockC);
    _block = blockC;

}

- (IBAction)action:(id)sender {
    NSLog(@"%@", _block);
}

这里的 block 在刚刚创建的时候,因为引用了外部变量,会创建到栈区。在 ARC 环境下,如果向 copy 修饰的 property 赋值,编译器会把这个 block 自动复制到堆区。
这个题里面,property 是 assign 修饰的,编译器自然不会自动复制,等 viewDidLoad 运行过后,block 已经被释放了。
指向 block 的指针是野指针

assign是指针赋值,不对引用计数操作,使用之后如果没有置为nil,可能就会产生野指针;而weak一旦不进行使用后,永远不会使用了,就不会产生野指针!

时间: 2024-11-11 03:12:16

assign与weak,野指针的相关文章

iOS中copy,retain,strong,assign,weak的区别以及使用

使用assign: 对基础数据类型 (NSInteger)和C数据类型(int, float, double, char,等)使用copy: 对NSString使用retain: 对其他NSObject和其子类 assign就是简单的赋值,不更改引用计数,所以直接使用基础数据 copy是直接拷贝内容,成为一个新的对象. retain释放旧的对象,将旧对象的值赋给新的对象,并使新的对象的引用计数加1 retain是指针拷贝 copy是分配新的内存属于内容拷贝,在拷贝之前都会释放旧的对象 在ARC中

iOS中修饰符assign与weak的区别

上次做项目的时候,因为将delegate声明成assign类型,导致了程序EXC_BAD_ACCESS异常.结果发现是assign与weak的最大区别 它们都是弱引用声明类型,最大的区别在那呢? 如果用weak声明的变量在栈中就会自动清空 如果用assign声明的变量在栈中可能不会自动赋值为nil,就会造成野指针错误!

MRC下delegate 野指针问题

最近项目开发中,临时被调去修复一个页面返回时crash的问题.出现这个问题的原因也很巧合,正好服务地址在同事电脑上,也正巧网络请求响应时间狂慢!一个请求发出去回来的时间是40秒左右,要是在线上,肯定会让用户抓狂死! 当我打开项目的时候,点击页面返回时,发现网络请求依然在请求中,第一感觉就是内存管理上出错.在全局断点中定位到出问题的点上,竟然是delegate回调的地方出现了问题! if (self.delegate && [self.delegate respondsToSelector:

assign和weak的深层次解析

我们知道在设置类的属性时,控件一般中weak,对象一般用strong,数据类型一般使用assign,其中weak和assign都不会使计数器增加,那为什对象不可以使用assign呢? weak与assignd的区别: weak:弱指针,不会让引用计数器+1,当其指向的对象被销毁时,这个弱指针会被清空,nil assign:不会使引用计数器+1,但对象被销毁时,指针不会清空,若用它来修饰对象,有可能会产生野指针. @property (nonatomic, assign) UIView *redV

iOS学习笔记-retain/assign/strong/weak/copy/mutablecopy/autorelease区别

readwrite:是可读可写特性,需要生成getter和setter方法:readonly是之都特性,只会生成getter方法,不会生成setter方法,不希望属性在类外改变时候使用:alloc 对象分配后引用计数为1retain 对象的引用计数+1 copy 一个对象变成新的对象(新内存地址) 引用计数为1 原来对象计数不变assign:是赋值特性,setter方法将传入参数赋值给实例变量(一把钥匙,同进同出):用于基础数据类型:weak:由ARC引入的对象变量的属性,比assign多了一个

MRC下delegate野指针问题

近项目开发中,临时被调去修复一个页面返回时crash的问题.出现这个问题的原因也很巧合,正好服务地址在同事电脑上,也正巧网络请求响应时间狂慢!一个请求发出去回来的时间是40秒左右,要是在线上,肯定会让用户抓狂死! 当我打开项目的时候,点击页面返回时,发现网络请求依然在请求中,第一感觉就是内存管理上出错.在全局断点中定位到出问题的点上,竟然是delegate回调的地方出现了问题! if (self.delegate && [self.delegate respondsToSelector:@

属性设置@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

七.OC基础加强--1.内存管理 2.野指针,内存泄露 3.set方法的内存管理 [email protected]参数 [email protected]和循环retain的使用 6.NSString的内存管理

1,内存管理简单介绍 1,为什么要有内存管理? malloc selloc dealloc```需要回头复习 一般的内存 4s 是512m内存:6 是1024m内存: 当内存过大时,会耗尽内存.出现程序闪退. 2.OC内存管理的范围 : 管理任何继承NSObject的对象,对其他的基本数据类型无效. 3.对象类型是程序运行过程中动态分配的,存储在堆区:内存管理主要是对 堆区中的对象的内存管理. 4.OC内存管理的原理 为了防止内存泄露 对象的引用计数器 : 每个OC对象都有自己的引用计数器,是一

请解释以下keywords的区别: assign vs weak, __block vs __weak

assign vs weak, __block vs __weak 字数364 阅读74 评论0 喜欢0 在objective-c中,类中的全局变量经常使用如下的方式申明. @property(nonatomic(1),strong(2))UIImageView *imageView; 其中的1,2处是对此变量的一些属性申明.有以下几种strong weakassignstrong 和 weak 是在arc后引入的关键字,strong类似于retain,引用时候会引用计算+1,weak相反,不会