수조나 사전이 인용 대상을 약하게 하는 방법

2497 단어

전언


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 방법을 할 때 서로 다른 수조 저장 유형에 따라 자신에게 적합한 알고리즘을 선택해야 하는데 여기에는 고정된 알고리즘이 없다.

좋은 웹페이지 즐겨찾기