在开发中我们经常使用代理,或自己写个代理,而代理属性都用weak(assign)修饰,看过有些开发者用strong(retain),但并没发现有何不妥,也不清楚weak(assign)与strong(retain)修饰有何区别

功能实现就行了,考虑这么多干嘛~~~我只能哈哈哈

  • weak:指明该对象并不负责保持delegate这个对象,delegate这个对象的销毁由外部控制
@property (nonatomic, weak) id<HSDogDelegate>delegate;
  • strong该对象强引用delegate,外界不能销毁delegate对象,会导致循环引用(Retain Cycles)
@property (nonatomic, strong) id<HSDogDelegate>delegate;

可能你还不太理解,没关系,下面先举例,看结果,再分析!

举例

  • HSDog类
    HSDog.h: @protocol HSDogDelegate <NSObject>
    @end @interface HSDog : NSObject @property (nonatomic, weak) id<HSDogDelegate>delegate; @end
    HSDog.m: #import "HSDog.h" @implementation HSDog - (void)dealloc
    {
    NSLog(@"HSDog----销毁");
    } @end
    HSPerson类
    HSPerson.h: @interface HSPerson : NSObject @end
    HSPerson.m: #import "HSPerson.h"
    #import "HSDog.h" @interface HSPerson()<HSDogDelegate>
    /** 强引用dog*/
    @property (nonatomic, strong) HSDog *dog;
    @end @implementation HSPerson - (instancetype)init
    {
    self = [super init];
    if (self) {
    // 实例化dog
    self.dog = [[HSDog alloc] init];
    // dog的delegate引用self,self的retainCount,取决于delegate修饰,weak:retainCount不变,strong:retainCount + 1
    self.dog.delegate = self; }
    return self;
    } - (void)dealloc
    {
    NSLog(@"HSPerson----销毁");
    } @end
    在ViewController实现:
    #import "ViewController.h"
    #import "HSPerson.h" @interface ViewController ()
    @end @implementation ViewController
    - (void)viewDidLoad {
    [super viewDidLoad];
    // 实例化person, self对person弱引用,person的retainCount不变
    HSPerson *person = [[HSPerson alloc] init]; }
    @end

结果

  • weak修饰代理
@property (nonatomic, weak) id<HSDogDelegate>delegate;

运行->打印

HSPerson----销毁
HSDog----销毁
  • strong修饰代理
@property (nonatomic, strong) id<HSDogDelegate>delegate;

运行->打印
....并未打印,说明HSPerson、HSDog对象没调用dealloc方法,两个对象未销毁
这也是我们经常说的内存泄露,该释放的内存并未释放!

附:

我们知道苹果在代理上给我们使用了weak和assign来修饰,但是两者有什么不同呢,那是因为weak可以将代理对象置为nil,而assgin不会。

iOS 代理为啥要用weak修饰?的更多相关文章

  1. iOS中代理属性为什么要用Weak修饰?

    一.写在前面 代理设计模式,在iOS开发过程中,是一个非常常见的设计模式,可以说用的范围非常广泛,而对初学者来讲,常常对代理的属性修饰用weak存在疑惑,因此下面就解释一下其中非常简单的道理. 二.必 ...

  2. 你真的了解iOS代理设计模式吗?

    在项目中我们经常会用到代理的设计模式,这是iOS中一种消息传递的方式,也可以通过这种方式来传递一些参数.这篇文章会涵盖代理的使用技巧和原理,以及代理的内存管理等方面的知识.我会通过这些方面的知识,带大 ...

  3. 【转】你真的了解iOS代理设计模式吗?

    转自:http://www.cocoachina.com/ios/20160317/15696.html 在项目中我们经常会用到代理的设计模式,这是iOS中一种消息传递的方式,也可以通过这种方式来传递 ...

  4. iOS代理模式(delegate)的使用

    前言: 代理模式是iOS中非常重要的一个模式,iOS SDK中的系统控件几乎都用到了代理模式.代理模式用来处理事件监听.参数传递功能. 协议创建(Protocol): 可手打如下代码,或者在代码块里面 ...

  5. iOS retain、strong、weak、assign

    iOS retain.strong.weak.assign strong与weak是由ARC新引入的对象变量属性xcode 4.2(ios sdk4.3和以下版本)和之前的版本使用的是retain和a ...

  6. ios代理设计模式

    代理设计模式的作用:     1.A对象监听B对象的一些行为,A成为B的代理     2.B对象想告诉A对象一些事情,A成为B的代理   代理设计模式的总结:     如果你想监听别人的一些行为,那么 ...

  7. iOS代理模式

    iOS代理模式的简单理解:当一个对象无法直接获取到另一个对象的指针,又希望对那个变量进行一些操作时,可以使用代理模式. 代理主要由三部分组成: (1)协议:用来指定代理双方可以做什么,必须做什么. ( ...

  8. 在ios下提示“@synthesize of ‘weak’ property is only allowed in ARC or GC mode”

    现在的项目是手动内存管理,所以在引入第三方资源库时候,很多资源库更新以后都开始使用arc进行编码,这样就导致两种代码风格不一致,有的时候可能开发者也没有注意到这些问题,反正用的时候也没有报错,就直接使 ...

  9. QF——iOS代理模式

    iOS的代理模式: A要完成某个功能,它可以自己完成,但有时出于一些原因,不方便自己完成.这时A可以委托B来帮其完成此功能,即由B代理完成.但是这个功能不是让B随随便便任其完成.此时,会有一个协议文件 ...

随机推荐

  1. z-index、absolute、marquee滚动条的问题

    1.z-index 层次叠加 ,元素叠加,谁的权重大谁就在上面 1).父级出现position:relation:的时候,失效: 2).层叠元素出现float的时候失效: 3).层次元素也得设置pos ...

  2. runtime运行时,类、对象、isa指针

    先查看一段OC源码,关于类的定义: /// An opaque type that represents an Objective-C class. typedef struct objc_class ...

  3. RabbitMQ-消费者"未处理完的消息"丢失

    一个关于客户端(消费者)开启自动应答,重启后"未处理消息丢失"的小坑.(主要是对RabbitMQ理解不够) 首先,申明一下: 本文所谓的 "丢失消息" 不是指服 ...

  4. 安装Tesseract

    下载网站 https://digi.bib.uni-mannheim.de/tesseract/

  5. 5-1 json模块

    1.json.loads(json_str)  把字符串(json串)转成字典 import json # 解析json的 json_str = ''' {"name":" ...

  6. ubuntu18.04 and Linux mint 19安装virtualbox

    1.1  安装Virtualbox root@amarsoft-ZHAOYANG-K43c-:~# apt-get install virtualbox -y 1.2  显示Virtualbox桌面图 ...

  7. 小技巧之padding-bottom实现等比例图片缩放

    1.padding-bottom 如果用%来表示的话,计算是根据父元素的width的值进行计算的. 例:父元素.wrapper的width是100px,height设置为0, padding-bott ...

  8. ArcGis API for JavaScript学习——离线部署API

    ArcGis API for JavaScript开发笔记——离线部署API 以3.18版API为例: 在加载图图前引用GIS服务是必须的.有两种方法,一是在线引用,而是离线部署引用. 在线引用: & ...

  9. Hive UDTF开发指南

    在这篇文章中,我们将深入了解用户定义表函数(UDTF),该函数的实现是通过继承org.apache.Hadoop.hive.ql.udf.generic.GenericUDTF这个抽象通用类,UDTF ...

  10. Django基于Pycharm开发之三[命名空间 与过滤器]

    关于命名空间的问题,在project项目中,我们可以设置路由类似于: from django.conf.urls import url,includefrom django.contrib impor ...