`
啸笑天
  • 浏览: 3465469 次
  • 性别: Icon_minigender_1
  • 来自: China
社区版块
存档分类
最新评论

strong修饰符实现weak效果(对象释放时,属性置nil)

 
阅读更多

 

 

//
//  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

分享到:
评论

相关推荐

    ios5arc详细说明

    3. **unsafe_unretained**:这个修饰符与`weak`类似,不会增加对象的引用计数,但不同之处在于,当对象被释放后,`unsafe_unretained`引用不会自动置为`nil`。这意味着如果一个`unsafe_unretained`变量仍然指向已...

    iOS内存管理方面的面试题汇总

    在ARC下,推荐使用`weak`,因为当对象释放时,`weak`引用会自动设为`nil`,避免野指针问题。 2. 对于代理(delegate)使用`weak`或`assign`,避免强引用循环。 3. NSTimer的循环引用可通过在不再需要定时器时调用`...

    iOS 对象属性详细介绍

    本文将深入探讨iOS对象的属性,包括其不同的修饰符,如`retain`、`strong`、`copy`、`weak`、`assign`、`readonly`、`readwrite`、`unsafe_unretained`,以及它们的作用和区别。 1. `retain`: `retain`关键字在ARC...

    objective-C的核心内容.doc

    - **循环引用**: `_strong`修饰符可能导致的对象间循环引用问题,可以使用`_weak`修饰符来避免。 - **内存泄露**: 如果对象在其生命周期结束后仍被引用,将导致内存泄露。 ### 总结 Objective-C的GCD提供了高效的...

    ARC到底帮我们做了哪些工作?(v1.3)

    - **`__weak`**:不增加引用计数,当对象被释放时,弱引用会自动变为nil,避免了强引用循环。 - **`__unsafe_unretained`**:不增加引用计数,对象被释放后,引用不会自动变为nil,可能导致野指针。 ### 4. ARC与...

    iOS常见的几个修饰词深入讲解

    在iOS开发中,修饰词是Objective-C编程中不可或缺的一部分,它们用于定义对象属性的行为和内存管理策略。本文将深入探讨一些常见的iOS修饰词,包括`assign`、`weak`、`strong`、`retain`、`copy`、`nonatomic`、`...

    Block实现原理与内存特性(v1.1)

    2. **__weak引用**:为避免循环引用,可以使用__weak修饰符来捕获对象。这样,当对象被释放时,Block不会阻止其释放,但Block内部的引用会变为nil。 3. **Block拷贝**:Block在栈上时,如果需要长期存在,系统会自动...

    (Swift)闭包作为属性

    为了解决这个问题,我们可以使用`weak`或`unowned`修饰符来弱引用或无主引用对象,防止循环引用。 总之,Swift中的闭包作为属性提供了极大的灵活性,让我们能够在对象中嵌入行为,实现复杂的功能。理解并熟练运用...

    ARC探秘:Objective-C中的自动引用计数革命

    这里`strong`属性修饰符表明`name`属性将会保持强引用,也就是说当`MyClass`实例被销毁时,`name`字符串也会被释放。 #### 5. ARC与循环引用 循环引用问题是在多对象之间相互引用时常见的问题,它可以导致内存泄漏...

    ios 面试题

    当被弱引用的对象被释放时,弱引用会被置为`nil`。 - `copy`:创建属性值的一个深拷贝。适用于字符串、数组等可变对象。 - `assign`:直接赋值,不改变引用计数。适用于基本数据类型,如int、float等。 #### 三、...

    ios就业面试题.docx编程资料

    `weak`表示弱引用,用于避免强引用循环,当被引用的对象被释放时,`weak`属性会被置为`nil`。 5. **`copy`、`assign`和`retain`的使用场景**: - `copy`:适用于实现了`NSCopying`协议的对象类型,例如`NSString`...

    2019面试题整理(76).pdf

    `weak`是一种属性修饰符,用于表明属性的引用是非拥有的。当属性所指向的对象被释放时,其值会被自动设置为`nil`,从而避免了强引用循环。在Objective-C中,通常用于非必需的对象引用,如代理等,以确保不会导致...

    iOS 常见面试题

    3. **访问控制修饰符**:`@protected`使得子类可以访问,`@private`仅在类内部可见,`@public`对所有代码可见,`@package`在打包时可见。 4. **id类型**:id是Objective-C的通用指针,可以指向任何Objective-C对象...

    iOS面试题分享

    - `weak`(ARC下):弱引用,不增加对象的引用计数,当对象被释放时自动设为nil,防止野指针。 关于类变量的访问控制修饰符: - `@private`:仅在类的内部可见,不能被子类继承。 - `@protected`:在类及其子类内部...

    ios开发面试题

    2. **`weak`**:弱引用表示不拥有对象的所有权,对象可能会被释放,当对象被销毁时,弱引用会被设置为`nil`。 3. **`_unsafe_unretained`**:这是一种非ARC模式下的弱引用,使用时需格外小心,因为可能会遇到野指针...

    iOS面试 面试必备神器

    #### 十、属性定义时的不同修饰符 1. **`assign`**:用于基本数据类型的简单赋值,适用于数值类型和指针。 2. **`retain`**:增加对象的引用计数,表明当前对象获得了对所指对象的所有权。 3. **`copy`**:用于复制...

    AboutProperty:简单获取对象属性列表,键值对,superclass列表

    属性声明通常包括类型、名称和可选的属性修饰符,如`nonatomic`、`strong`、`weak`、`readonly`等。例如: ```objc @property (nonatomic, strong) NSString *name; ``` 这声明了一个名为`name`的属性,类型为`...

    Objective-C基础教程.docx

    - 属性修饰符:`readonly`、`readwrite`、`assign`、`atomic`、`nonatomic`、`copy`、`retain`等。 - 自动合成:使用`@synthesize`自动创建属性对应的实例变量和存取方法。 6. **内存管理**: - **引用计数**:...

    objc代码-Objc - 循环引用1

    - 使用弱引用(weak):对于代理、观察者和Block,可以将引用属性设置为`weak`,这样在对象被释放后,弱引用会自动变为nil,打破循环引用。 - 使用.unowned引用:在确定对象不会提前释放的情况下,可以使用....

    [Objective-C.2.0程序设计

    理解如何正确使用属性的`strong`,`weak`,`unsafe_unretained`,`assign`等修饰符,以及`autorelease`,`retainCount`等概念对于避免内存泄漏至关重要。 7. **Category**:类别允许向已存在的类添加方法,而无需...

Global site tag (gtag.js) - Google Analytics