iOS 메모리 누수
Analyze 테스트 문제
Memory error
1. Null passed to a callee that requires a non-null 1st parameter 호출 방법에는 비빈 매개변수가 필요합니다.e.g:
UIImage *image = [UIImage imageWithData:data];
원인: 2진 데이터 흐름을 그림으로 변환합니다. 데이터가nil이면 이 방법을 사용하지 마십시오.하지만 붕괴되지는 않을 거예요, 직접 측정해 보세요.수정:
if(data) {
UIImage *image = [UIImage imageWithData:data];
}
2. Merrory(Core Foundation/Objective-C)
1. Potential leak of an object stored into'cs'는 객체에서 참조 계수에 1을 더하는 함수를 호출하지만 참조 계수를 1로 줄이는 함수는 호출되지 않습니다.e.g:
CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray();
CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, cs, (CGBitmapInfo)kCGImageAlphaNone);
원인:Core Foundation은 C 언어 프레임워크로 ARC가 아니라 수동으로 메모리를 방출해야 하기 때문에 비교적 구덩이입니다.수정:
CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray();
CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, cs, (CGBitmapInfo)kCGImageAlphaNone);
CGColorSpaceRelease(cs);
(3) Dead store 1.Value stored to ‘payResoult’ during its initialization is never read. 'pay Resoult' 에 저장된 값은 읽은 적이 없습니다.e.g:
NSString *str = @"Dead store ";
str = @"Dead store never used";
원인: 당신은 메모리에 공간을 신청하고 값을 저장했지만 저장한 값을 사용한 적이 없어서 메모리를 헛되이 소모했습니다.처리:소용없으니 삭제해라.
(4) Coding Conventions(Apple) Method accepting NSError** should have a non-void value to indicatie whether or not an error occurred;e.g:
- (void)doDecodeMultiple:(ZXBinaryBitmap *)image hints:(ZXDecodeHints *)hints results:(NSMutableArray *)results xOffset:(int)xOffset yOffset:(int)yOffset currentDepth:(int)currentDepth error:(NSError **)error;
이유: (NSError**) error -> error의 주소(&error).error가nil일 때, &error도 의미가 없습니다. 왜냐하면 계속 오류가 있을 수 없기 때문입니다.처리:당분간 어떤 대신이 알려줄 수 있는지 모르겠어요.
Leaks 테스트 문제
하나.AFNetworking e.g
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; manager.requestSerializer = [AFJSONRequestSerializer serializer];//
manager.responseSerializer = [AFHTTPResponseSerializer serializer];//
manager.requestSerializer.timeoutInterval = 5.0f;
[manager POST:strURL parameters:parameters progress:^(NSProgress * _Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
responseObject = [FHTool ResultDic:responseObject];
if (responseObject) {
if (networkInfoBLock) {
networkInfoBLock(NetworkReturnCodeSuccess,responseObject);
}
}else {
if (networkInfoBLock) {
networkInfoBLock(NetworkReturnCodeFailed,nil);
}
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"strURL = %@
error = %@",strURL,error.localizedDescription);
if (networkInfoBLock) {
networkInfoBLock(NetworkReturnCodeFailed,@{@"error":error.localizedDescription});
}
}];
원인: 데이터를 요청할 때마다 AFHTTPSessionManager 대상을 만들고 ARC 모드에서는 방출할 수 없습니다.해결: 데이터 요청 클래스를 하나의 예로 봉하여 AFHTTPSessionManager 대상만 만듭니다.NetworkManager.h
#import
#import
typedef void (^NetworkInfoBLock)(NetworkReturnCode networkReturnCode ,NSDictionary *responseObject);
@interface NetworkManager : NSObject
@property (nonatomic, strong) AFHTTPSessionManager *manager;
+ (instancetype) shareNetworkManager;
// post
- (void)postNetworkByURL: (NSString *)strURL AndParameter: (id)parameters AndNetworkSuccessBLock:
(NetworkInfoBLock)networkInfoBLock;
@end
NetworkManager.m
#import "NetworkManager.h"
@implementation NetworkManager
+ (instancetype) shareNetworkManager {
static NetworkManager * networkManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
networkManager = [[NetworkManager alloc] init];
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];//
manager.responseSerializer = [AFHTTPResponseSerializer serializer];//
manager.requestSerializer.timeoutInterval = 5.0f;
networkManager.manager = manager;
});
return networkManager;
}
- (void)postNetworkByURL: (NSString *)strURL AndParameter: (id)parameters AndNetworkSuccessBLock:
(NetworkInfoBLock)networkInfoBLock {
[self.manager POST:strURL parameters:parameters progress:^(NSProgress * _Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
responseObject = [FHTool ResultDic:responseObject];
if (responseObject) {
if (networkInfoBLock) {
networkInfoBLock(NetworkReturnCodeSuccess,responseObject);
}
}else {
if (networkInfoBLock) {
networkInfoBLock(NetworkReturnCodeFailed,nil);
}
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"strURL = %@
error = %@",strURL,error.localizedDescription);
if (networkInfoBLock) {
networkInfoBLock(NetworkReturnCodeFailed,@{@"error":error.localizedDescription});
}
}];
}
@end
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.