수조나 사전이 인용 대상을 약하게 하는 방법
전언
array나 dictornary에 대상을 추가하는 것은 흔히 볼 수 있는 일입니다. 일반적으로 문제가 발생하지 않습니다.그러나 이 용기에 정적 전역 대상이 계속 존재할 경우 Object의 방출에 영향을 주고 메모리 유출을 초래할 수 있다.처음에는 이(가) 정의되었습니다.weak object, 그리고 그것을 매개 변수로 하면 됩니다. 너무 기상천외합니다. 이런 것들은 여전히strong에서 인용됩니다.
주요한 해결 방법은 세 가지가 있다.
1. NSValue에서 사용할 수 있는valueWithNonretainedObject:view 방법으로 대상을 약하게 인용합니다
NSValue *key = [NSValue valueWithNonretainedObject:view];
[dic setObject:outlineView forKey:key];
2.NSMapTable, NSPointerArray,NSHashTable
NSMapTable 을 초기화하는 두 가지 방법이 있습니다.
- (instancetype)initWithKeyOptions:(NSPointerFunctionsOptions)keyOptions valueOptions:(NSPointerFunctionsOptions)valueOptions capacity:(NSUInteger)initialCapacity NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithKeyPointerFunctions:(NSPointerFunctions *)keyFunctions valuePointerFunctions:(NSPointerFunctions *)valueFunctions capacity:(NSUInteger)initialCapacity NS_DESIGNATED_INITIALIZER;
NSPointer Functions Options는 메모리 관리 정책의 매개 값으로 주로 NSPointer Functions Weak Memory, NSPointer Functions Strong Memory 두 값이 있는데 약한 인용과 강한 인용을 대표한다.NSPointer Functions Weak Memory는 우리가 원하는 것이다.뿐만 아니라 NSMapTable의 키와value는 각각 약한 인용이나 강한 인용을 설정할 수 있어 매우 강력하다.약한 인용 대상이 풀려나면 어떻게 되나요?키 대상이 풀리면 키=nil, 키와value는 모두 제거되며, 적어도 옮겨다닐 때는 옮겨다니지 않습니다.value 대상이 풀리면 키가 존재합니다.value=nil
Key와 value 모두 참조되지 않습니다. 예를 들면 다음과 같습니다.
_table = [[NSMapTable alloc] initWithKeyOptions:NSPointerFunctionsWeakMemory valueOptions:NSPointerFunctionsWeakMemory capacity:4];
[_table setObject:[UIView new] forKey:@"weakKey"];
[_table setObject:self.view forKey:@"strongKey"];
NSPointerArray의 초기화는 NSMapTable와 매우 비슷하다. 이것은 가변적이고null에 삽입할 수 있는 그룹이다. 약한 인용 NSHashTable는 NSMutableSet과 유사하며 약한 인용을 지원한다. 가변적이고null에 삽입할 수 있는 set을 지원한다.
NSFastEnumeration 프로토콜
우리는 집합류가 NSFastEnumeration이라는 협의를 실현한 것을 자주 발견한다. 예를 들어 NSArray, NSDictionary, NSMapTable, NSHashTable 등이다.프로토콜의 정의:
@protocol NSFastEnumeration
- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id __unsafe_unretained _Nullable [_Nonnull])buffer count:(NSUInteger)len;
@end
NSFast Enumeration이라는 협의를 실현하면 for/in 문법당을 지원하지만
enumerateObjectsUsingBlock
방법이 있을 수는 없다. 이 방법은 NSArray가 스스로 정의하여 실현한 것이다.그리고 사용자 정의 클래스 실현countByEnumeratingWithState
방법을 할 때 서로 다른 수조 저장 유형에 따라 자신에게 적합한 알고리즘을 선택해야 하는데 여기에는 고정된 알고리즘이 없다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.