IOS 이미지 저장 3 가지 방식 의 실현

4567 단어 IOS그림 저장 소
Image.xcassets
  • .xcassets 를 만 들 고 Image Set 형식 으로 그림 을 관리 하 며 그림 을 추가 하면 해당 하 는 content.json 파일
  • 을 생 성 합 니 다.
  • @2x 와@3x 등 배 도 를 추가 한 후 포장 후 Assets.car 형식 으로 존재 합 니 다.
  • [UIImage imageNamed:@"xxx"]방식 으로 그림 을 읽 을 수 있 습 니 다.그림 캐 시―key-value 사전 을 만 든 셈 입 니 다.key 는 그림 이름 이 고 value 는 그림 대상 입 니 다.그림 대상 을 만 들 면 해당 대상 은 NSCache 에 추 가 됩 니 다(디 코딩 된 Image Buffer).메모리 경 고 를 받 을 때 까지 사용 하지 않 는 그림 대상 을 방출 합 니 다.따라서 여러 곳 에 표시 해 야 하 는 그림 에 대응 하 는 UIImage 대상 은 한 번 만 생 성(메모리 경 고 를 고려 하지 않 을 때 회수)되 어 메모리 소 모 를 줄 일 수 있 습 니 다.
  • 그림 을 프로젝트 에 직접 추가 하여 리 소스 로 사용 합 니 다.
    읽 기 방식:그림 리 소스 폴 더 를 만 들 고 그림 을 프로젝트 에 직접 추가 합 니 다.다음 과 같은 방식 으로 그림 을 읽 습 니 다.
    
    NSString *path = [NSBundle.mainBundle pathForResource:@"xxx" type:@"png"];
    UIImage *image = [UIImage imageWithContentsOfFile:path];
    기능:리 소스 의 이미지 관리 방식 에서 모든 그림 생 성 은 파일 데 이 터 를 읽 어서 얻 을 수 있 습 니 다.파일 데 이 터 를 한 번 읽 으 면 NSData 와 UIImage 가 생 성 됩 니 다.그림 을 만 든 후 해당 NSData 를 삭제 합 니 다.UIImage 의 인용 카운터 가 0 으로 변 할 때 UIImage 를 자동 으로 삭제 합 니 다.그러면 그림 이 메모리 에 장기 적 으로 존재 하지 않도록 보장 할 수 있 습 니 다.
    장면 사용:이러한 방법의 특성 으로 인해 리 소스 의 방법 은 보통 그림 데이터 가 매우 크 고 그림 은 여러 번 사용 하지 않 아 도 되 는 경우,예 를 들 어 안내 페이지 배경(그림 전체 화면)이다.
    장점:그림 은 메모리 에 오래 저장 되 지 않 기 때문에 메모리 낭비 가 많 지 않 습 니 다.이 동시에 큰 그림 은 장기 적 으로 사용 되 지 않 고 큰 그림 이 메모 리 를 차지 하 는 것 이 작은 그림 보다 여러 배 많 기 때문에 큰 그림 의 메모리 점용 을 줄 이 는 과정 에서 리 소스 는 매우 잘 한다.
    Bundle 파일 사용
  • Bundle 은 자원 파일 패키지 로 많은 그림,XIB,텍스트 파일 을 한데 묶 어 Bundle 파일 로 포장 하여 다른 항목 에서 가방 안의 자원 을 참조 하 는 데 편리 합 니 다.
  • Bundle 파일 은 정적 이 며 프로젝트 의 컴 파일 에 참여 하지 않 습 니 다.Bundle 패키지 에는 실행 가능 한 파일 이 포함 되 어 있 지 않 습 니 다.자원 으로 만 특정한 바 이 너 리 데이터 로 분 석 됩 니 다.
  • 장점:Bundle 에서 파일 은 프로젝트 컴 파일 에 참여 하지 않 고 App 패키지 의 크기 에 영향 을 주지 않 습 니 다(App 의 다이어트 에 사용 할 수 있 습 니 다).bundle 방식 을 사용 하여 파일 을 관리 하 는 데 편리 하고 다른 항목 에서 가방 안의 자원 을 참조 하 는 데 편리 합 니 다.
  • 사용 장면:비교적 큰 그림 또는 사용 빈도 가 낮은 그림
  • 읽 기 방식:image WithContentsOfFile 로 읽 기,다음 방법 1;UIImage 를 확장 할 수도 있 습 니 다.다음 방법 2
  • imageWithContentsOfFile 로 읽 기
    
    /// BSKDefine.h
    
    // bundle path
    #define STBundle_Name @"SafeToolResource.bundle"
    #define STBundle_Path [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:STBundle_Name]
    #define STBundle [NSBundle bundleWithPath:STBundle_Path]
    
    
    /// usage
    
    #import "BSKDefine.h"
    UIImageView * headerBgImgView = [[UIImageView alloc] init];
    headerBgImgView.image = [UIImage imageWithContentsOfFile:[SecKill_BUNDLE pathForResource:@"xxxx" ofType:@"png"]];
    
    UIImage 확장,UIImage+BSKResources 클래스 생 성
    
    /// UIImage+BSKResources.h
    
    NS_ASSUME_NONNULL_BEGIN
    
    @interface UIImage (BSKResources)
    
    + (UIImage *)bskImageNamed:(NSString *)imageName InBundleName:(NSString *)bundleName;
    
    @end
    
    NS_ASSUME_NONNULL_END
    
    
    /// UIImage+BSKResources.m
    
    #import "UIImage+BSKResources.h"
    
    @implementation UIImage (BSKResources)
    
    + (UIImage *)bskImageNamed:(NSString *)imageName InBundleName:(NSString *)bundleName
    {
      NSString *resourcePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:bundleName];
      NSBundle *resourceBundle = [NSBundle bundleWithPath:resourcePath];
      return [UIImage imageNamed:imageName inBundle:resourceBundle compatibleWithTraitCollection:nil];
    }
    @end
    
    
    
    /// usage
    
    #import "UIImage+BSKResources.h"
    
    UIImageView * headerBgImgView = [[UIImageView alloc] init];
    headerBgImgView.image = [UIImage bskImageNamed:@"xxx" InBundleName:@"BSKResources.bundle"]];
    
    Bundle 과 xcassets 의 차이
  • xcassets 에 있 는 그림 은 imageNamed 로 만 불 러 올 수 있 습 니 다.Bundle 은 이미지 위 드 콘 텐 츠 OfFile 등 을 통 해 불 러 올 수 있 습 니 다
  • xcassets 에 있 는 2x 와 3x 는 구체 적 인 장치 에 따라 배포 되 며,동시에 포함 되 지 않 습 니 다(App Slicing).Bundle 은 모두 포함 되 어 있 습 니 다
  • .
  • xcassets 에서 그림 을 Slicing 할 수 있 습 니 다.즉,재단 과 스 트 레 칭,Bundle 은 지원 하지 않 습 니 다
  • Bundle 내 다 중 언어 지원,xcassets 지원 하지 않 음
  • 또한 imageNamed 로 만 든 UIImage 는 NSCache 에 즉시 추 가 됩 니 다(디 코딩 된 Image Buffer).메모리 경 고 를 받 을 때 까지 사용 하지 않 는 UIImage 를 방출 합 니 다.이미지 위 드 콘 텐 츠 OfFile 을 사용 하여 만 든 대상 은 매번 메모 리 를 다시 신청 하고 같은 그림 은 캐 시 되 지 않 습 니 다.따라서 자주 사용 하 는 작은 그림 은 xcassets 에 두 고 관리 하 는 것 을 권장 합 니 다.큰 그림,사용 빈도 가 낮은 그림 은 Bundle 에 두 고 관리 해 야 합 니 다
  • .
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기