Tags: Objective-C, iOS, 修飾詞
介紹
assign 修飾詞通常用于修飾基礎(chǔ)數(shù)據(jù)類型(如NSInteger、BOOL等)和C數(shù)據(jù)類型(如int旺入、float荷并,double等)
常用與基本數(shù)據(jù)類型颤专,也可以作用在對象類型
若作用與對象類型時敬矩,會存在野指針的情況嚼黔,所以我們平時不會通過 assign 來修飾對象類型
實(shí)踐
Demo 地址:https://github.com/lishangjing-dmeo/AssignObjectDemo
@interface ViewController ()
@property (nonatomic, strong) NSString *strongString;
@property (nonatomic, assign) NSString *assignString;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
}
// MARK: NSString Test
- (IBAction)createNSString:(UIButton *)sender {
// _strongString __NSCFConstantString * @"123" 0x00000001002000b0
_strongString = @"123";
_assignString = _strongString;
NSLog(@"%@",_strongString); // 123
NSLog(@"%p",_strongString); // 0x1002000b0
NSLog(@"%@",_assignString); // 123
NSLog(@"%p",_assignString); // 0x1002000b0
}
- (IBAction)removeNSString:(id)sender {
_strongString = nil;
NSLog(@"%@",_strongString);
NSLog(@"%p",_strongString);
// createNSString3
// Thread 1: EXC_BAD_ACCESS (code=2, address=0x4955427e90)
NSLog(@"%@",_assignString);
NSLog(@"%p",_assignString);
/**
2023-08-15 16:38:29.190727+0800 GroceryDemo[17859:6365915] (null)
2023-08-15 16:38:29.190844+0800 GroceryDemo[17859:6365915] 0x0
2023-08-15 16:38:29.190910+0800 GroceryDemo[17859:6365915]
2023-08-15 16:38:29.190970+0800 GroceryDemo[17859:6365915] 0x1097d5e90
*/
}
@end
遇到的問題:
當(dāng)我嘗試用 NSString 來復(fù)現(xiàn)該結(jié)論時,當(dāng)我置空字符串時_strongString = nil;
發(fā)現(xiàn) NSString 并沒有復(fù)現(xiàn)野指針問題禁灼,下面是我創(chuàng)建 NSString 的方式管挟,以及賦值
NSString *str2 = [NSString stringWithFormat:@"123"];
NSString *str2 = @"123";
擴(kuò)展&解決問題:
這里的對象類型中,NSString 存在特殊的情況
- NSString 不同的創(chuàng)建方式弄捕,會創(chuàng)建不同的 NSString 對象 →
- 不同的 NSString 對象,會決定內(nèi)存被存放的位置 →
- 不同的存放位置決定是否會發(fā)生野指針(僅存放在堆中的對象會發(fā)生野指針)导帝。
NSString *str1 = [NSString stringWithFormat:@"小強(qiáng)"];
NSString *str2 = [NSString stringWithFormat:@"1"];
NSString *str3 = [NSString stringWithFormat:@"a"];
NSString *str4 = @"123456789";
__NSCFConstantString
顯然是常量字符串守谓,自然就是存儲在常量區(qū)
__NSCFString
表示為oc對象,NSString就是封裝的CFString您单,0x6000000315c0
地址顯示這個字符串對象存儲在堆中
NSTaggedPointerString
這個類表示這是字符串的一種指針Tagged Pointer斋荞。
Untitled 1.png
引用文章: