static NSMutableDictionary *weaks;
struct OjcP {
Class isa;
//...
};
static NSNumber *objHeapAddress(id obj) {
struct OjcP *heapObj = (__bridge struct OjcP *)(obj);
return @((long)&(heapObj->isa));
}
@interface ReleasableObject : NSObject
@end
@implementation ReleasableObject
-(void)dealloc {
[super dealloc];
NSLog(@"--- ReleasableObject dealloc ---");
id p = [weaks objectForKey:objHeapAddress(self)];
id *p1 = (id *)[p longValue];
NSLog(@"读取弱指针地址:%p", p1);
*p1 = nil;
}
@end
int main(int argc, const char * argv[]) {
NSObject *obj;
NSObject *weak_p;
@autoreleasepool {
// 弱引用
obj = [[ReleasableObject alloc] init];
weak_p = obj;
NSLog(@"存储弱指针地址:%p", &weak_p);
// NSLog(@"%@", weak_p);
// 方法1
// weak_p = nil;
// 方法2
// id *p = &weak_p;
// *p = nil;
// 方法3
weaks = [[NSMutableDictionary alloc] init];
// 弱指针地址
long p11 = (long)(&weak_p);
// 堆内存中对象isa地址
[weaks setObject:@(p11) forKey:objHeapAddress(obj)];
// 释放对象
[obj release];
}
// 崩溃代码
NSLog(@"%@", weak_p);
return 0;
}
iOS weak的实现原理
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...