001-weakとassignの違い

2230 ワード

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 *)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 *)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 *)touches withEvent:(UIEvent *)event {
        // frame
        _redView.frame = CGRectMake(100, 100, 100, 100);
    }
    
    @end
    
    
  • 小結:スクリーンをクリックすると、プログラムが潰れます!!!
  • が潰れた原因はredViewが現在assgin修飾を使用しているためであり、assginの特性は以下の通りである:assgin:_unsafe_unretained修飾では、参照カウンタ+1は使用されず、指向するオブジェクトが破棄された場合、ポインタは自動的に空になりません.