self.xx和_xx继承中的问题

self.属性_成员变量 基本区别就不细说了,这里主要谈论的是在子类继承中的问题. 在看此篇内容之前,先看一下文中图片部分内容.

一.初始化
  • 1定义一个继承UIViewFather类,- (UIView *)getRedView返回的是self.red;
//Father.m
#import "Father.h"
@interface Father ()
@property (nonatomic, strong) UIView *red;
@end
@implementation Father
- (instancetype)init
{
    self = [super init];
    if (self) {
        self.red = [UIView new];
    }
    return self;
}
- (UIView *)getRedView {
    return self.red;
}
@end
  • 2定义一个继承FatherSon
//Son.m
#import "Son.h"
@interface Son ()
@property (nonatomic, strong) UIView *red;
@end

@implementation Son
@end
/ /调用
Son *ss = [Son new];
NSLog(@"====%@",[ss getRedView]);有值//====<UIView: 0x7fa38a705c30; frame = (0 0; 0 0); layer = <CALayer: 0x600000e5d620>>
二.修改Father.m中的方法,- (UIView *)getRedView返回的是_red;此时结果如下图
- (UIView *)getRedView {
    return _red;
}
此时self.red有值而_red为nil
/ /调用
Son *ss = [Son new];
NSLog(@"====%@",[ss getRedView]);没有值//====(null)
三.一般在第三方库不满足需求的时候,我们会进行继承,重写方法,这个时候容易出现这个问题, 如果不知道这点, 很容易报错.
// 在Son.m文件中实现下面这个方法就可以解决,当然还有其他方法,大家可以自己测试
- (UIView *)getRedView {
    return _red;
}