美文网首页
19-内存管理02(内存布局/Tagged Pointer)

19-内存管理02(内存布局/Tagged Pointer)

作者: weyan | 来源:发表于2019-03-11 13:18 被阅读0次

    一、内存布局

    二、Tagged Pointer

    1.Tagged Pointer不是OC对象,不会直接调用setter或getter方法
    2.直接把数据存到到地址中,取数据的时候也直接去地址中去。



    OC对象地址的最低有效位是0
    #import "ViewController.h"
    
    @interface ViewController ()
    @property (strong, nonatomic) NSString *name;
    @end
    
    @implementation ViewController
    
    //setter方法底层MRC下
    //- (void)setName:(NSString *)name
    //{
    //    if (_name != name) {
                           //先释放旧对象
    //        [_name release];
    //        _name = [name retain];
    //    }
    //}
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        /**
        1.ARC最终会转化为MRC
        2.多线程访问name的Setter方法时当有一个线程释放旧对象后其他线程再去释放就会报错(坏内存访问)。
       */
    //    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    //
    //    for (int i = 0; i < 1000; i++) {
    //        dispatch_async(queue, ^{
    //            // 加锁
    //            self.name = [NSString stringWithFormat:@"abcdefghijk"];
    //            // 解锁
    //        });
    //    }
        
        /**当NSString指针空间够存储数据时会采用Tagged Pointer技术
         1.Tagged Pointer不是OC对象,不会直接调用setter或getter方法
         2.直接把数据存到到地址中,去数据的时候也直接去地址中去。
       */
    //    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    //
    //    for (int i = 0; i < 1000; i++) {
    //        dispatch_async(queue, ^{
    //            self.name = [NSString stringWithFormat:@"abc"];
    //        });
    //    }
        
    //    NSString *str1 = [NSString stringWithFormat:@"abcdefghijk"];
        NSString *str2 = [NSString stringWithFormat:@"123abc"];
        
    //    NSLog(@"%@ %@", [str1 class], [str2 class]);
        NSLog(@"%p", str2);
    }
    
    @end
    

    相关文章

      网友评论

          本文标题:19-内存管理02(内存布局/Tagged Pointer)

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