1、测试场景:点击屏幕的时候给屏幕添加一个红色的view
2、测试weak
#import "ViewController.h"
@interface ViewController ()
/** 控件使用weak */
@property (nonatomic,weak) UIView *redView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UIView *redView = [[UIView alloc] init];
redView.backgroundColor = [UIColor redColor];
[self.view addSubview:redView];
_redView = redView;
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
//设置frame
_redView.frame = CGRectMake(100, 100, 100, 100);
}
@end
- 小结:点击屏幕可以实现屏幕上添加一个红色的view
#import "ViewController.h"
@interface ViewController ()
/** 控件使用weak */
@property (nonatomic,weak) UIView *redView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UIView *redView = [[UIView alloc] init];
redView.backgroundColor = [UIColor redColor];
//[self.view addSubview:redView];
_redView = redView;
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
//设置frame
_redView.frame = CGRectMake(100, 100, 100, 100);
}
@end
- 小结:当注释[self.view addSubview:redView];代码后,由于redView没有强应用,所以过了viewDidLoad方法以后,redView就会被释放了。此时的_redView也没有指向了应该是一个“野指针”,但是程序并不会崩溃。这是因为redView是由于weak修饰的原因(weak:__weak 弱指针,不会让引用计数器+1,如果指向的对象被销毁,指针会自动情况)
3、测试assgin
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic,assign) UIView *redView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UIView *redView = [[UIView alloc] init];
redView.backgroundColor = [UIColor redColor];
//[self.view addSubview:redView];
_redView = redView;
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
//设置frame
_redView.frame = CGRectMake(100, 100, 100, 100);
}
@end
- 小结:当点击屏幕时,程序会奔溃!!!
- 奔溃的原因是因为redView现在是使用 assgin 修饰,assgin的特性如下:assgin: __unsafe_unretained修饰,不会让引用计数器+1,如果指向的对象被销毁了,指针是不会自动清空的。