Programing

[UIImage imageNamed…]와 [UIImage imageWithData…]의 차이점은 무엇입니까?

lottogame 2020. 11. 18. 08:19
반응형

[UIImage imageNamed…]와 [UIImage imageWithData…]의 차이점은 무엇입니까?


파일 시스템에서 내 응용 프로그램으로 일부 이미지를로드하고 싶습니다. 이를 수행하는 두 가지 쉬운 방법이 있습니다.

[UIImage imageNamed:fullFileName]

또는:

NSString *fileLocation = [[NSBundle mainBundle] pathForResource:fileName ofType:extension];
NSData *imageData = [NSData dataWithContentsOfFile:fileLocation];

[UIImage imageWithData:imageData];

코드가 훨씬 적기 때문에 첫 번째를 선호하지만 일부 사람들은 이미지가 캐시되고이 방법이 더 많은 메모리를 사용한다고 말하는 것을 보았습니다. 나는 대부분의 다른 포럼에서 사람들을 신뢰하지 않기 때문에 여기서 질문을 할 것이라고 생각했습니다. 실제적인 차이가 있습니까? 그렇다면 어느 것이 '더 나은'것입니까?

객체 할당 도구를 사용하여 앱 프로파일 링을 시도해 보았지만 시뮬레이터에서만 시도했지만 iPhone 자체에서는 시도하지 않았지만 실제적인 차이를 볼 수 없습니다.


이미지로 무엇을하는지에 따라 다릅니다. imageNamed:방법은 이미지를 캐시하지만 대부분의 경우 메모리 사용에 도움이됩니다. 예를 들어 이미지를 10 번로드하여 테이블보기의 일부 텍스트와 함께 표시하는 경우 UIImage는 10 개의 개별 개체를 할당하는 대신 메모리에 해당 이미지의 단일 표현 만 유지합니다. 반면에 매우 큰 이미지가 있고이를 다시 사용하지 않는 경우 데이터 개체에서 이미지를로드하여 작업이 끝났을 때 메모리에서 제거되었는지 확인할 수 있습니다.

큰 이미지가 없더라도 걱정하지 않을 것입니다. 문제가 발생하지 않는 한 (선제 적으로 최적화하는 대신 객체 할당을 확인하는 것에 대한 찬사) 무시할만한 메모리 개선보다 적은 코드 줄을 선택합니다.


내 경험상 [UIImage imageNamed:]특히 UITableViews.

메모리뿐만 아니라 image. 캐시하는 것이 훨씬 빠릅니다.


UIImage 의 API 참조에 따르면 다음과 같습니다.

+ (UIImage *) imageNamed : (NSString *) 이름

이 메서드는 시스템 캐시에서 지정된 이름을 가진 이미지 개체를 찾고있는 경우 해당 개체를 반환합니다. 일치하는 이미지 개체가 아직 캐시에 없으면이 메서드는 지정된 파일에서 이미지 데이터를로드하고 캐시 한 다음 결과 개체를 반환합니다.

+ (UIImage *) imageWithContentsOfFile : (NSString *) 경로

이 메서드는 이미지 개체를 캐시하지 않습니다.

그래서, 우리는 당신이 같은 많은 경우 볼 수있는 UI 요소 (종종로 같은 이미지를 사용할 수 있습니다 (예 :있는 UITableViewCell 등) 아이콘 )으로 인한 성능, 물론 우리가 다시 사용하려는 동일한 이미지를 우리가, 다른 사용을 위해 약간의 메모리를 절약합니다. 일반적으로 재사용 된 이미지 는 사용자가 여러 번 작업 할 수있는 ui 요소에서 자주 사용됩니다 . 그래서 우리가 그것을 재사용하는 것을 가치있게 생각합니다. 그래서 당신은 imageNamed 메소드 를 사용하도록 선택할 수 있습니다 .

반면에 응용 프로그램 에는 Button, 로고보기와 같이 앱의 수명주기 동안있을 UI 요소 가 있으므로 이러한 ui 요소에서 사용하는 이러한 이미지는 앱이 실행되는 동안에도있을 수 있습니다. 수명주기,이 이미지가 캐시 여야하는지 여부를 고려하지 않을 것이므로 imageNamed 메서드 를 사용하도록 선택할 수 있습니다 .


반대로 애플리케이션에는 동적으로 생성되는 UI 요소 가있는 경우가 많습니다 . 예를 들어, 우리의 응용 프로그램 지원 동적 배경은 해당 사용자가 .And 같은 배경들이 선택할 수 있도록 배경은 우리가 다른의 목록을 많이하는 인터페이스가있을 수 .SO 이미지를 수 있습니다 배경은 (종종 사용에 의해 보여 UIImageView에 사용자가 선택할 수있는)을 , 우리는 목록 뷰의 이름을 MyBackgroundListView지정할 수 있습니다 . 사용자가 배경 이미지를 선택 하면 MyBackgroundListView 는 기능이 완료되었으므로 파괴되어야합니다. 다음에 사용자가 배경을 변경하고 싶을 때MyBackgroundListView 다시. MyBackgroundListView에서 사용 하는 이미지 는 캐시되지 않아야 합니다. 그렇지 않으면 응용 프로그램의 메모리가 부족하므로 이번에는 imageWithContentsOfFile 메서드 를 사용해야합니다 .

보기에서 고해상도 화면을 지원 하는 Apple의 문서에 따르면

고해상도 화면이있는 기기에서 imageNamed : , imageWithContentsOfFile :initWithContentsOfFile : 메소드는 이름에 @ 2x 수정자가있는 요청 된 이미지의 버전을 자동으로 찾습니다. 하나를 찾으면 대신 해당 이미지를로드합니다. 주어진 이미지의 고해상도 버전을 제공하지 않는 경우 이미지 객체는 여전히 표준 해상도 이미지 (있는 경우)를로드하고 드로잉 중에 배율을 조정합니다.

그래서 당신은 망막 화면 문제에 대한 이미지의 검색 경로에 대해 걱정할 것입니다. IOS는 당신이 그것을 다루는 데 도움이 될 것입니다.

불쌍한 영어에 대해 죄송합니다. 도움이 되길 바랍니다.


이미지를 캐시하지 않으려면 initWithContentsOfFile을 직접 사용할 수도 있습니다.

NSString *fileLocation = [[NSBundle mainBundle] pathForResource:fileName ofType:extension];
UIImage* yourImage = [[[UIImage alloc] initWithContentsOfFile:imagePath] autorelease];

또한 [UIImage imageNamed:]캐싱이 너무 많고 이미지가 자주 공개되지 않는다고 들었 습니다. 조심해서 사용하라고 들었습니다.


imageWithData는 이미지 바이너리를 데이터베이스에 저장하거나 웹에서 큰 이미지를 점진적으로 다운로드 할 때 유용합니다.


앱에 동일하지 않은 큰 이미지가 많이 있으면 imagenamed를 사용하지 않습니다. 너무 많이 사용하여 앱 충돌이 발생했습니다.


나는 이미지가 전혀 캐시되지 않는다고 믿지 않으며 왜 당신이 그렇게 말하는지 모르겠습니다. UIImage는 관련 항목을 추적하기 위해 참조 카운터를 사용하는 NSObject의 하위 클래스입니다. 따라서 이미지를로드하면 동일한 작업을 수행합니다. 동일한 이미지를 여러 번로드하면 메모리에 이미지 사본이 하나만 있고 해당 이미지에 무언가를 사용해야 할 때마다 참조 카운터를 증가시킵니다. 참조 카운터 란 카운트가 0이되면 스스로 삭제된다는 의미입니다. 그래서 "alloc", "retain"은 카운트에 각각 +1이고 "release"는 -1입니다. 메모리를 관리하는 더 좋은 방법 일뿐만 아니라 이러한 스타일의 프로그래밍은 메모리 누수를 정리하는데도 도움이됩니다.

참고 URL : https://stackoverflow.com/questions/316236/difference-between-uiimage-imagenamed-and-uiimage-imagewithdata

반응형