#import "ViewController.h"
@interface ViewController ()
@property (nonatomic, strong) NSString *strongString;
@property (nonatomic, copy) NSString *copyedString;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self demo2];
// 對於不可變字符串而言,使用strong和copy都是淺拷貝,打印的地址都是一致的
NSString *string = [NSString stringWithFormat:@"123"];
self.strongString = string;
self.copyedString = string;
NSLog(@" string: %p",string);
NSLog(@" strongString : %p",self.strongString);
NSLog(@" copyedString : %p",self.copyedString);
}
// 測試可變字符串使用copy屬性(其實使用copy屬性 至關於該變量進行了一次copy操做[string copy])
- (void)demo2{
// 不可變字符串
NSMutableString *string = [NSMutableString stringWithFormat:@"123"];
// 用strong修飾的屬性記錄
self.strongString = string;
// 用copy修飾的屬性記錄
self.copyedString = string;
// 打印地址
NSLog(@" string: %p",string);
NSLog(@" strongString : %p",self.strongString);
NSLog(@" copyedString : %p",self.copyedString);
NSLog(@"%@",self.copyedString);
// 改變字符串,對比用strong和copy修飾的屬性的區別
[string appendString:@"bbb"];
NSLog(@" strongString : %@ %p",self.strongString, self.strongString);
NSLog(@" copyedString : %@ %p",self.copyedString, self.copyedString);
}
@end
咱們發現用copy修飾的屬性地址已經變了,緣由是NSMutableString的對象copy操做 產生新地址,產生的是不可變的對象,因此改變string,,不會改變被copy修飾的屬性.正好符合咱們改變string 不會改變self.copyedstring的值,而self.strongstring的值已經改變了
block 本质上是一个OC对象,内部有个 isa 指针,可以用 retain/strong/copy 等修饰词修饰。但是 block 在创建的时候内存默认分配在栈上,而不是堆上的。所以它的作用域仅限创建时候的作用域内,当你在该作用域外调用该 block 时,程序就会崩溃。
方法1.直接赋值: NSString *testStr1 = @"a";
方法2.类函数初始化生成: (自动释放内存)
NSString *testStr2 = [NSString stringWithString:@"b"];
NSString *testStr3 = [NSString stringWithFormat:@"c"];
方法3.实例方法初始化生成: (手动释放内存,存在isa优化,个数小于9,不存在中文和特殊字符,为tagged类型)
NSString *testStr4 = [[NSString alloc] initWithString:@"d"];
NSString *testStr5 = [[NSString alloc] initWithFormat:@"e"];
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。