// // NSObject+EZ_Dealloc.h // EZToolKit // // Created by yangjun zhu on 2017/1/6. // Copyright © 2017年 Cactus. All rights reserved. // #import <Foundation/Foundation.h> typedef void (^voidBlock)(void); @interface EZBlockExecutor : NSObject - (id)initWithBlock:(voidBlock)block; @end @interface NSObject (EZ_Dealloc) - (void)ez_runAtDealloc:(voidBlock)block; @end
// // NSObject+EZ_Dealloc.m // EZToolKit // // Created by yangjun zhu on 2017/1/6. // Copyright © 2017年 Cactus. All rights reserved. // #import "NSObject+EZ_Dealloc.h" #import <objc/runtime.h> @interface EZBlockExecutor() { voidBlock _block; } @end @implementation EZBlockExecutor - (id)initWithBlock:(voidBlock)aBlock { self = [super init]; if (self) { _block = [aBlock copy]; } return self; } - (void)dealloc { _block ? _block() : nil; } @end const void *runAtDeallocBlockKey = &runAtDeallocBlockKey; @implementation NSObject (EZ_Dealloc) - (void)ez_runAtDealloc:(voidBlock)block{ if (block) { EZBlockExecutor *executor = [[EZBlockExecutor alloc] initWithBlock:block]; objc_setAssociatedObject(self, runAtDeallocBlockKey, executor, OBJC_ASSOCIATION_RETAIN); } } @end
https://github.com/easyui/EZToolKit/blob/master/EZToolKit/EZCategory/Foundation/NSObject/NSObject%2BEZ_Dealloc.m
相关推荐
3. **unsafe_unretained**:这个修饰符与`weak`类似,不会增加对象的引用计数,但不同之处在于,当对象被释放后,`unsafe_unretained`引用不会自动置为`nil`。这意味着如果一个`unsafe_unretained`变量仍然指向已...
在ARC下,推荐使用`weak`,因为当对象释放时,`weak`引用会自动设为`nil`,避免野指针问题。 2. 对于代理(delegate)使用`weak`或`assign`,避免强引用循环。 3. NSTimer的循环引用可通过在不再需要定时器时调用`...
本文将深入探讨iOS对象的属性,包括其不同的修饰符,如`retain`、`strong`、`copy`、`weak`、`assign`、`readonly`、`readwrite`、`unsafe_unretained`,以及它们的作用和区别。 1. `retain`: `retain`关键字在ARC...
- **循环引用**: `_strong`修饰符可能导致的对象间循环引用问题,可以使用`_weak`修饰符来避免。 - **内存泄露**: 如果对象在其生命周期结束后仍被引用,将导致内存泄露。 ### 总结 Objective-C的GCD提供了高效的...
- **`__weak`**:不增加引用计数,当对象被释放时,弱引用会自动变为nil,避免了强引用循环。 - **`__unsafe_unretained`**:不增加引用计数,对象被释放后,引用不会自动变为nil,可能导致野指针。 ### 4. ARC与...
在iOS开发中,修饰词是Objective-C编程中不可或缺的一部分,它们用于定义对象属性的行为和内存管理策略。本文将深入探讨一些常见的iOS修饰词,包括`assign`、`weak`、`strong`、`retain`、`copy`、`nonatomic`、`...
2. **__weak引用**:为避免循环引用,可以使用__weak修饰符来捕获对象。这样,当对象被释放时,Block不会阻止其释放,但Block内部的引用会变为nil。 3. **Block拷贝**:Block在栈上时,如果需要长期存在,系统会自动...
为了解决这个问题,我们可以使用`weak`或`unowned`修饰符来弱引用或无主引用对象,防止循环引用。 总之,Swift中的闭包作为属性提供了极大的灵活性,让我们能够在对象中嵌入行为,实现复杂的功能。理解并熟练运用...
这里`strong`属性修饰符表明`name`属性将会保持强引用,也就是说当`MyClass`实例被销毁时,`name`字符串也会被释放。 #### 5. ARC与循环引用 循环引用问题是在多对象之间相互引用时常见的问题,它可以导致内存泄漏...
当被弱引用的对象被释放时,弱引用会被置为`nil`。 - `copy`:创建属性值的一个深拷贝。适用于字符串、数组等可变对象。 - `assign`:直接赋值,不改变引用计数。适用于基本数据类型,如int、float等。 #### 三、...
`weak`表示弱引用,用于避免强引用循环,当被引用的对象被释放时,`weak`属性会被置为`nil`。 5. **`copy`、`assign`和`retain`的使用场景**: - `copy`:适用于实现了`NSCopying`协议的对象类型,例如`NSString`...
`weak`是一种属性修饰符,用于表明属性的引用是非拥有的。当属性所指向的对象被释放时,其值会被自动设置为`nil`,从而避免了强引用循环。在Objective-C中,通常用于非必需的对象引用,如代理等,以确保不会导致...
3. **访问控制修饰符**:`@protected`使得子类可以访问,`@private`仅在类内部可见,`@public`对所有代码可见,`@package`在打包时可见。 4. **id类型**:id是Objective-C的通用指针,可以指向任何Objective-C对象...
- `weak`(ARC下):弱引用,不增加对象的引用计数,当对象被释放时自动设为nil,防止野指针。 关于类变量的访问控制修饰符: - `@private`:仅在类的内部可见,不能被子类继承。 - `@protected`:在类及其子类内部...
2. **`weak`**:弱引用表示不拥有对象的所有权,对象可能会被释放,当对象被销毁时,弱引用会被设置为`nil`。 3. **`_unsafe_unretained`**:这是一种非ARC模式下的弱引用,使用时需格外小心,因为可能会遇到野指针...
#### 十、属性定义时的不同修饰符 1. **`assign`**:用于基本数据类型的简单赋值,适用于数值类型和指针。 2. **`retain`**:增加对象的引用计数,表明当前对象获得了对所指对象的所有权。 3. **`copy`**:用于复制...
属性声明通常包括类型、名称和可选的属性修饰符,如`nonatomic`、`strong`、`weak`、`readonly`等。例如: ```objc @property (nonatomic, strong) NSString *name; ``` 这声明了一个名为`name`的属性,类型为`...
- 属性修饰符:`readonly`、`readwrite`、`assign`、`atomic`、`nonatomic`、`copy`、`retain`等。 - 自动合成:使用`@synthesize`自动创建属性对应的实例变量和存取方法。 6. **内存管理**: - **引用计数**:...
- 使用弱引用(weak):对于代理、观察者和Block,可以将引用属性设置为`weak`,这样在对象被释放后,弱引用会自动变为nil,打破循环引用。 - 使用.unowned引用:在确定对象不会提前释放的情况下,可以使用....
理解如何正确使用属性的`strong`,`weak`,`unsafe_unretained`,`assign`等修饰符,以及`autorelease`,`retainCount`等概念对于避免内存泄漏至关重要。 7. **Category**:类别允许向已存在的类添加方法,而无需...