一、内存布局
二、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
网友评论