iOS开发iosiOS

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

2016-02-18  本文已影响4832人  forvert

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

一.写在前面

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

二.必要的知识补充.

三.案例说明

  1. 案例介绍
```
    案例中的类介绍: 案例共用到三个类,Baby类(婴儿类),LLBabyServant类(保姆类),ViewControllr类(控制器类),其中说明问题的关键是之前两个类.
    假设,婴儿类要想做一些事情(像换衣服了,方便了之类的...)就必须具有代理的属性,因此指定了一个协议<LLBabyDelegate>,合情合理.而保姆需要成为婴儿的代理,必须遵循协议,废话不多说,上代码!
```
  1. 首先介绍Baby类-----.h文件
```
// 制定协议
@protocol LLBabyDelegate <NSObject>
//这里可以编写代理方法(该案例中用不到所以就不写了)
@end

@interface Baby : NSObject
/**
 *  baby的代理属性(这里用的是weak修饰,正确的做法)
 */
@property(nonatomic, weak) id<LLBabyDelegate>delegate;
@end

```

说明:跟上面描述的一样婴儿拥有一个代理的属性.并且用修饰词Weak修饰的.

接着粘Baby类-----.m文件

```
@implementation Baby
- (void)dealloc
{
    NSLog(@"Baby被销毁了");
}
@end
```
说明:该方法的作用是当该类的对象被销毁时会调用-dealloc方法(在这个案例中用来观察对象是否被销毁了)
  1. 再有介绍BabyServant类-----.m文件

    //BabyServant类也就是保姆必须遵循代理协议 
    @interface BabyServant()<LLBabyDelegate>
    //并有一个需要照顾的Baby
    @property(nonatomic, strong) Baby *baby;
    
    @end
    
    @implementation LLBabyServant
    //初始化方法
    - (instancetype)init
    {
     self = [super init];
    
        if (self) {
        // 初始化'婴儿'对象
        self.baby = [[Baby alloc]init];
        // 设置'自己(LLBabyServant)'为(Baby)类的代理
        self.baby.delegate = self;
        }
    
     return self;
    }
    
  2. 我们介绍最后一个类 ViewController类

    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        LLBabyServant *servant = [[LLBabyServant alloc]init];
    
        }
    
    @end
    
    

    说明: 在ViewController的方法ViewDidLoad中创建保姆对象,并且该对象作用的范围是这个方法内部.这个方法执行完成,servant对象就会被销毁了.

    上面的代码执行完成之后,运行结果如下:

    2016-02-18 15:06:41.151 代理weak案例[1805:173874] LLBabyServant 被销毁了
    2016-02-18 15:06:41.152 代理weak案例[1805:173874] Baby类被销毁了
    
    
这就说明LLBabyServant对象和Baby对象在没有用处之后都会被销毁,但是如果用代理用strong修饰,而不是用weak修饰,则不会打印上面的结果!

四.分析

1. 用weak分析图如下:
2. 用strong分析如下

这就是为什么代理属性要用weak修饰的原因了!如果有哪里不严谨或者错误的地方,希望能够多多交流.

上一篇下一篇

猜你喜欢

热点阅读