在項目中使用靜態(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)的錯誤,即實例_name和self沒有賦值。
2、由2和3比較得知,開頭的兩個提示并不是 bug,只是代碼不夠嚴謹,有可能出現(xiàn)1、中的問題。
最后附上源碼
PS:歡迎批評指正,如果對你有幫助的話,來個 star 吧,謝謝。