使用__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 {
}
网友评论