在項目中使用靜態(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...]'
這兩個提示信息解決的辦法如下:
- (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的情況除抛。
然后分析兩個提示信息
先分析第二個做裙,雙擊藍色提示如下:
提示假定在判定條件為
false
情況下return self
中的 self
并不是[super init]
返回的self
肛鹏,當然[super init]
返回的也可能是其他值,那么這中情況下返回的 self
是沒有意義的在分析第一個
提示在假定條件為
ture
情況下才會使用實例化_name
,這里依然沒有設(shè)置self = [super init]
烟逊,同剛才分析的關(guān)鍵點一樣都在于此蜓席,即[super init]
的返回值沒有設(shè)定self
衷旅,當然[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 吧涝登,謝謝。