And*_*mig 4 weak-references ios automatic-ref-counting
这是我的代码:
extern void _objc_autoreleasePoolPrint();
int main(int argc, const char * argv[])
{
NSArray __weak *tmp = nil;
@autoreleasepool {
NSArray __strong *obj = [[NSArray alloc] init];
NSLog(@"obj &: %p", obj);
tmp = obj;
NSLog(@"tmp &: %p", tmp);
_objc_autoreleasePoolPrint();
}
NSLog(@"tmp: %@", tmp); // why not (null) ?
return 0;
}
Run Code Online (Sandbox Code Playgroud)
和控制台输出:
2013-05-01 22:14:32.966 SimpleConsoleObjectiveCApplicationWithARC[40660:f07] obj &: 0x7fedf9403110
2013-05-01 22:14:32.969 SimpleConsoleObjectiveCApplicationWithARC[40660:f07] tmp &: 0x7fedf9403110
objc[40660]: ##############
objc[40660]: AUTORELEASE POOLS for thread 0x7fff751af180
objc[40660]: 2 releases pending.
objc[40660]: [0x7fedf9805000] ................ PAGE (hot) (cold)
objc[40660]: [0x7fedf9805038] ################ POOL 0x7fedf9805038
objc[40660]: [0x7fedf9805040] 0x7fedf9403110 __NSArrayI
objc[40660]: ##############
2013-05-01 22:14:32.971 SimpleConsoleObjectiveCApplicationWithARC[40660:f07] tmp: (
)
Run Code Online (Sandbox Code Playgroud)
PS#1
将NSArray更改为NSMutableArray并且tmp变量变为nil.
extern void _objc_autoreleasePoolPrint();
int main(int argc, const char * argv[])
{
NSMutableArray __weak *tmp = nil;
@autoreleasepool {
NSMutableArray __strong *obj = [[NSMutableArray alloc] init];
NSLog(@"obj &: %p", obj);
tmp = obj;
NSLog(@"tmp &: %p", tmp);
_objc_autoreleasePoolPrint();
}
NSLog(@"tmp: %@", tmp);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下为什么它会这样运作吗?
它似乎[[NSArray alloc] init]返回一个空的"共享实例" NSArray:
NSArray *a = [[NSArray alloc] init];
NSArray *b = [[NSArray alloc] init];
NSLog(@"a &: %p", a);
NSLog(@"b &: %p", b);
Run Code Online (Sandbox Code Playgroud)
输出:
a &: 0x100103110
b &: 0x100103110
即使您的强引用obj已消失,此"共享实例"仍然存在,因此弱指针未设置为nil.
显然,[[NSMutableArray alloc] init]无法返回共享实例.
| 归档时间: |
|
| 查看次数: |
275 次 |
| 最近记录: |