美文网首页
__autoreleasing 与声明二级指针

__autoreleasing 与声明二级指针

作者: 传说中的汽水枪 | 来源:发表于2019-06-16 18:55 被阅读0次

使用__autoreleasing声明变量的时候就相当于MRC使用了autorelease函数:

- (void)test_autoreleasing_ownership {
    id obj1 = [NSObject new];
    __autoreleasing id obj2 = [RXTMOwnershipObject new]; // 会加入到自动autoreleasePool中
    _objc_autoreleasePoolPrint();
    id obj3 = [RXTMOwnershipObject new]; // 不会加入到自动autoreleasePool中
    _objc_autoreleasePoolPrint();
    NSLog(@"obj1:%@, obj2:%@, obj3:%@", obj1, obj2, obj3);
}

其中_objc_autoreleasePoolPrint可以通过(系统未公开的一个函数):

extern void _objc_autoreleasePoolPrint(void); 

__autoreleasing 与二级指针的关系

- (void)test_autoreleasing_ownership_2 {
    id obj1 = [NSObject new];
    __autoreleasing id obj2 = obj1;
    NSLog(@"obj1:%@, obj2:%@", obj1, obj2);
    
//    NSError **pErrorNone = nil; // error : Pointer to non-const type 'NSError *' with no explicit ownership
    
//    NSError *error = nil;
//    NSError **pError = &error; // error : Pointer to non-const type 'NSError *' with no explicit ownership
    
//    __autoreleasing NSError *errorAutoreleasing = nil;
    //    NSError **pErrorAutoreleasing = &errorAutoreleasing; // error: Initializing 'NSError *__strong *' with an expression of type 'NSError *__autoreleasing *' changes retain/release properties of pointer
    
    __autoreleasing NSError *errorAutoreleasing2 = nil;
    __autoreleasing NSError **pErrorAutoreleasing2 = &errorAutoreleasing2; // OK
    [self testWithError:pErrorAutoreleasing2];
    
    NSError *errorStrong = nil;
    __strong NSError **pErrorStrong = &errorStrong; // OK
//    [self testWithError:pErrorStrong]; // error
    
    __weak NSError *errorWeak = nil;
    __weak NSError **pErrorWeak = &errorWeak; // OK
//    [self testWithError:errorWeak]; // error
    
    __unsafe_unretained NSError *errorUnsafeUnretained = nil;
    __unsafe_unretained NSError **pErrorUnsafeUnretained = &errorUnsafeUnretained; // OK
//    [self testWithError:pErrorUnsafeUnretained]; // error
    
}
- (void)testWithError:(NSError **)error {
    
}

相关文章

网友评论

      本文标题:__autoreleasing 与声明二级指针

      本文链接:https://www.haomeiwen.com/subject/zangfctx.html