Tagged Pointer
通常创建对象,对象存储在堆中,对象的指针存储在栈中。
我们要找到这个对象,就需要先在栈中,找到指针,然后通过指针找到堆中的对象。
这个过程比较繁琐,当存储的对象只是个很小的东西,比如字符串,数字,走这个繁琐的过程,耗费性能。
从64bit开始,iOS 引入了Tagged Pointer技术,用于优化NSNumber、NSDate、NSString等小对象的存储
在没有使用Tagged Pointer之前, NSNumber等对象需要动态分配内存、维护引用计数等,NSNumber指针存储的是堆中NSNumber对象的地址值.
使用Tagged Pointer之后,NSNumber指针里面存储的数据变成了:Tag + Data,也就是将数据直接存储在了指针中.
当指针不够存储数据时,才会使用动态分配内存的方式来存储数据.
objc_msgSend能识别Tagged Pointer,比如NSNumber的intValue方法,直接从指针提取数据,节省了以前的调用开销.
// 是否是tagger pointer
- (void)test {
NSNumber *number1 = @4;
NSNumber *number2 = @5;
NSNumber *number3 = @(0xFFFFFFFFFFFFFFF);
NSLog(@"%d %d %d", [self isTaggedPointer:number1], [self isTaggedPointer:number2], [self isTaggedPointer:number3]);
NSLog(@"%p %p %p", number1, number2, number3);
}
set方法,会先release
-(void)setName:(NSString *)name{
if(_name != name){
[_name realease];
_name = [name copy];
}
return _name;
}
多线程release会导致crash
网友评论