Analyze提示 Instance variable與Returning 'self' used while 'self' is not set to the result of '[(sup...

在項目中使用靜態(tài)分析工具(Analyze),提示Instance variable used while 'self' is not set to the result of '[(super or self) init...]'和 Returning 'self' while it is not set to the result of '[(super or self) init...]'


pcc 圖一.png

這兩個提示信息解決的辦法如下:

- (instancetype)init {
    if (self = [super init]) {
        NSLog(@"%s, line = %d",__FUNCTION__,__LINE__);
        _name = @"love";
    }
    return self;
}

為什么這么做呢?
在解析之前先新建兩個類:LoveObjc(繼承NSObject) 與LoveObjcClass(繼承LoveObjc)

#import <Foundation/Foundation.h>

@interface LoveObjc : NSObject
- (instancetype)init;
@end

#import "LoveObjc.h"

@implementation LoveObjc
- (instancetype)init {
    self = [super init];
  
    if (self) {
        NSLog(@"%s, line = %d",__FUNCTION__,__LINE__);
    }
    return self;
    
}
@end
#import "LoveObjc.h"

@interface LoveObjcClass : LoveObjc
- (instancetype)init;
/** name  **/
@property (nonatomic, strong) NSString * name;

@end

#import "LoveObjcClass.h"

@implementation LoveObjcClass
- (instancetype)init {
    if ([super init]) {
        NSLog(@"%s, line = %d",__FUNCTION__,__LINE__);
        _name = @"love";
    }
    return self;
}
@end

此時利用Analyze就會出現(xiàn)pcc圖一.png的情況。
然后分析兩個提示信息
先分析第二個,雙擊藍色提示如下:

pcc 圖2.png

提示假定在判定條件為false情況下return self中的 self 并不是[super init]返回的self,當(dāng)然[super init]返回的也可能是其他值,那么這中情況下返回的 self是沒有意義的
在分析第一個
pcc 圖3.png

提示在假定條件為ture情況下才會使用實例化_name,這里依然沒有設(shè)置self = [super init],同剛才分析的關(guān)鍵點一樣都在于此,即[super init]的返回值沒有設(shè)定self,當(dāng)然[super init]返回的也可能是其他值。

  • 1、現(xiàn)在就假定LoveObjc初始化返回值為nil
#import "LoveObjc.h"

@implementation LoveObjc
- (instancetype)init {
    self = [super init];
  
    if (self) {
        NSLog(@"%s, line = %d",__FUNCTION__,__LINE__);
    }
    return nil;
    
}
#import "LoveObjcClass.h"

@implementation LoveObjcClass
- (instancetype)init {
    if ([super init]) {
        NSLog(@"%s, line = %d",__FUNCTION__,__LINE__);
        _name = @"love";
    }
    return self;
}

#import "ViewController.h"
#import "LoveObjcClass.h"

@interface ViewController ()

@end

@implementation ViewController

//調(diào)用打印
- (void)viewDidLoad {
    [super viewDidLoad];
    LoveObjcClass *loveClass = [[LoveObjcClass alloc]init];
    NSLog(@"my name is %@",loveClass.name);

}

看一下打印信息:

-[LoveObjc init], line = 16
my name is (null)
  • 2、再看一下LoveObjc初始化返回值為self
- (instancetype)init {
    self = [super init];
  
    if (self) {
        NSLog(@"%s, line = %d",__FUNCTION__,__LINE__);
    }
    return self;
    
#import "LoveObjcClass.h"

@implementation LoveObjcClass
- (instancetype)init {
    if ([super init]) {
        NSLog(@"%s, line = %d",__FUNCTION__,__LINE__);
        _name = @"love";
    }
    return self;
}
}

打印信息:

 -[LoveObjc init], line = 16
 -[LoveObjcClass init], line = 14
 my name is love
  • 3、看一下LoveObjc初始化返回值為self,LoveObjcClass設(shè)置if (self = [super init])
- (instancetype)init {
    self = [super init];
  
    if (self) {
        NSLog(@"%s, line = %d",__FUNCTION__,__LINE__);
    }
    return self;
    
#import "LoveObjcClass.h"

@implementation LoveObjcClass
- (instancetype)init {
    if ([super init]) {
        NSLog(@"%s, line = %d",__FUNCTION__,__LINE__);
        _name = @"love";
    }
    return self;
}
}

打印信息:

-[LoveObjc init], line = 16
 -[LoveObjcClass init], line = 14
 my name is love

總結(jié):

1、由1和2、1和3比較得知,關(guān)鍵在于父類LoveObjc初始化返回值,如果為nil,就印證了開頭的兩個提示會出現(xiàn)的錯誤,即實例_nameself沒有賦值。
2、由2和3比較得知,開頭的兩個提示并不是 bug,只是代碼不夠嚴謹,有可能出現(xiàn)1、中的問題。

最后附上源碼

PS:歡迎批評指正,如果對你有幫助的話,來個 star 吧,謝謝。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容