char *c1 = "abc"; NSString *str4 = [NSString stringWithUTF8String:c1]; NSLog(@"%@",str4);//abc NSMutableString NSMutableString *str = [NSMutableString string]; NSLog(@"%@",str); //字符串拼接 [str appendString OccurrencesOfString:需要替换的字符串 //withString:用什么替换 //options:替换时的搜索方式 //range:搜索范围 //返回值:替换了多少个 NSMutableString *strM = [NSMutableString stringWithFormat:@"abcdefgbc"]; NSUInteger count = [strM replaceOccurrencesOfString
这里总结一下字符串NSString与NSMutableString。 一. NSMutableString NSMutableString对象代表一个字符序列可变的字符串,而且NSMutableString是NSString的子类,因此前面介绍的NSString所包含的方法 ,NSMutableString都可以直接使用,NSMutableString对象也可直接当成NSString对象使用。 stringWithString,用不可变字符串创建可变字符串: //从不可变字符串创建可变字符串 mstr = [NSMutableString stringWithString *mstr; 14 NSRange substr; 15 16 //从不可变字符串创建可变字符串 17 mstr = [NSMutableString
创建一个不可变的副本(NSString\NSArray\NSDictionary) mutableCopy :创建一个可变的副本 (NSMutableDictionary\NSMutableArray\NSMutableString *copyStr = [str copy]; NSMutableString *mcopyStr = [str mutableCopy]; NSLog(@"str = %@, copyStr = %@ *str = [NSMutableString stringWithFormat:@"demo"]; NSMutableString *copyStr = [str copy]; NSMutableString *firstNameStr = [[NSMutableString alloc]initWithFormat:@"firstName-AA"]; Person *p = [[Person alloc] *lastNameStr = [[NSMutableString alloc]initWithFormat:@"lastNameStr-BB"]; p.lastName = lastNameStr;
NSMutableString 1. NSMutableString介绍 NSMutableString 类继承NSString类,那么NSString提供的方法在NSMutableString中基本都可以使用,NSMutableString NSMutableString和NSString的区别 NSString是不可变的,里面的文字内容是不能进行修改的 NSMutableString是可变的,里面的文字内容可以随时更改 NSMutableString 3.png 可变:指的是字符串在内存中占用的存储空间可以不固定,并且存储的内容可以被修改 NSMutableString *str = [NSMutableString string]; NSLog(@ NSMutableString常用方法 拼接aString到字符串最后面- (void)appendString:(NSString *)aString; NSMutableString *str =
创建一个不可变的副本(NSString;NSArray;NSDictionary;) mutableCopy :创建一个可变的副本 (NSMutableDictionary; NSMutableArray;NSMutableString 浅拷贝:如果没有生成新对象我们称为浅拷贝,本质是指针拷贝,指向的还是同一处 深拷贝:如果生成了新的对象,我们称为深拷贝,本质就是创建了一个新的对象 NSString * str = @"demo"; NSMutableString *copyStr = [str copy]; NSMutableString *mcopyStr = [str mutableCopy]; NSLog(@"str = %@ copyStr = *str1 = [NSMutableString stringWithFormat:@"demo"]; NSMutableString *copyStr1 = [str1 mutableCopy]; NSMutableString *mcopyStr1 = [str1 mutableCopy]; NSLog(@"str = %@ copyStr = %@ mcopyStr = %@",str1
这样下来我们至少需要一个数组和一个可变字符 串,所以在 .h文件中定义 @property(nonatomic,retain)NSArray * changeArray; @property(nonatomic,retain)NSMutableString alloc] initWithObjects:@"0",@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9", nil];//存放十个数,以备随机取 NSMutableString getStr = [[NSMutableString alloc] initWithCapacity:5]; self.changeString = [[NSMutableString 作为下标值取数组里面的数放到一个可变字符串里,在存放到自身定义的可变字符串 getStr = self.changeArray[index]; self.changeString = (NSMutableString
像NSString这种对象,还有一个相关的叫NSMutableString。所以在非集合对象中又可以分为可变对象和不可变对象。 ),copy和mutableCopy都是深复制,都会创建一个新的同样的内容来返回,但是要注意,copy返回的是不可变对象,也就是说即使你对一个NSMutableString做copy操作,返回给另一个NSMutableString ,然后去对这个NSMutableString做变化操作,会报错。 = [string mutableCopy];// 深复制 NSMutableString *string = [NSMutableString stringWithString: @"origin "]; NSString *stringCopy = [string copy];// 深复制 NSMutableString *mStringCopy = [string copy];// 深复制 NSMutableString
NSMutableString场景一 NSMutableString *newString = [NSMutableString stringWithFormat:@"newString"]; _strongStr NSMutableString场景二 NSMutableString *newString = [NSMutableString stringWithFormat:@"newString"]; self.strongStr 属性的set方法是调用了新值的copy协议,也就是调用了NSMutableString的copyWithZone方法 4. NSMutableString的copyWithZone方法 Founation苹果并没有开源,所以需要别的途径。 发现最终调用了NSMutableString的allocWithZone 5. NSMutableString的allocWithZone ? 6. NSAllocateObject方法 ?
UTF8String]; unsigned char md5c[16]; CC_MD5(myPassword, (CC_LONG)strlen(myPassword), md5c); NSMutableString *md5Str = [[NSMutableString alloc] initWithCapacity:100]; //md5c[1] -> 0x16; for (int i = 0; i < UTF8String]; unsigned char md5c[16]; CC_MD5(myPassword, (CC_LONG)strlen(myPassword), md5c); NSMutableString *md5Str = [[NSMutableString alloc] initWithCapacity:100]; // md5c[1] -> 0x16; [md5Str appendFormat *md5Str = [[NSMutableString alloc] initWithCapacity:100]; // md5c[1] -> 0x16; [md5Str appendFormat
都遵循以下准则: copy返回immutable对象;所以,如果对copy返回值使用mutable对象接口就会crash; mutableCopy返回mutable对象; 下图详细阐述了NSString、NSMutableString 下面看一下非集合类NSString对象拷贝的例子: copy NSString *string = @"origin"; NSString *stringCopy = [string copy]; NSMutableString mutableCopy NSMutableString *string = [NSMutableString stringWithString: @"origin"]; //copy NSString *stringCopy = [string copy]; NSMutableString *mStringCopy = [string copy]; NSMutableString ,虽然程序传入的NSMutableString,但程序调用该参数的copy方法得到的是不可变副本。
*dataString = [NSMutableString string]; // [dataString appendString:@"OPTIONS "]; [dataString *dataString = [NSMutableString string]; [dataString appendString:[NSString stringWithFormat:@"DESCRIBE *dataString = [NSMutableString string]; [dataString appendString:[NSString stringWithFormat:@"SETUP *dataString = [NSMutableString string]; [dataString appendString:[NSString stringWithFormat:@"SETUP *dataString = [NSMutableString string]; [dataString appendString:[NSString stringWithFormat:@"PLAY
原因:这里的copy是浅拷贝,并没有生成新的对象 NSMutableString场景一 // 使用NSMutableString直接赋值 NSMutableString *originStr = [NSMutableString 继续往下看 NSMutableString场景二 // 第二种场景:用NSMutableString直接赋值 NSMutableString *originStr = [NSMutableString 2.当源字符串是NSMutableString时,strong只是将源字符串的引用计数加1,而copy则是对原字符串做了次深拷贝,从而生成了一个新的对象,并且copy的对象指向这个新对象。 所以,如果源字符串是NSMutableString的时候,使用strong只会增加引用计数。但是copy会执行一次深拷贝,会造成不必要的内存浪费。 但是,我们一般声明NSString时,也不希望它改变,所以一般情况下,建议使用copy,这样可以避免NSMutableString带来的错误。
选择使用copy的理由是,NSString属性可能被传入一个NSString实例,也可能是一个NSMutableString实例。 当传入了一个NSMutableString实例时,字符串的值可能会在背后悄悄变化。 NSObject @property (strong, nonatomic) NSString *title; @end 在另一个类中,我们有一个这样的方法: - (void)stringExample { NSMutableString *bookTitle = [NSMutableString stringWithString:@"Best book ever"]; Book *book = [[Book alloc] init
*mutableString = [[NSMutableString alloc] initWithString:@"Jiaming Chen"]; NSString *copyMutableString = [mutableString copy]; NSMutableString *mutableCopyMutableString = [mutableString mutableCopy alloc] initWithString:@"Jiaming Chen"]; NSString *copyStr = [str copy]; NSMutableString 第二组创建了一个NSMutableString类型的对象,同样获取了不可变和可变副本对象,输出的结果发现三者的地址都不同了。 第三组实验使用多态的方式创建了一个编译时类型为NSString而运行时为NSMutableString的对象,并获取可变和不可变副本对象,输出地址发现三者的地址都不同了。
下面先看个非集合类immutable对象拷贝的例子 NSString *string = @"origin"; NSString *stringCopy = [string copy]; NSMutableString 通过查看内存,可以看到 stringCopy 和 string 的地址是一样,进行了指针拷贝;而 stringMCopy 的地址和 string 不一样,进行了内容拷贝; 再看mutable对象拷贝例子: NSMutableString *string = [NSMutableString stringWithString: @"origin"]; //copy NSString *stringCopy = [string copy] ; NSMutableString *mStringCopy = [string copy]; NSMutableString *stringMCopy = [string mutableCopy]; 当属性类型为 NSString 时,经常用此特质来保护其封装性,因为传递给设置方法的新值有可能指向一个 NSMutableString 类的实例。
这一点是完全可以的,因为 NSMutableString 的父类就是 NSString。 NSMutableString 是一个可以改变的对象,如果我们用 strong 修饰,NSString 对象强引用了 NSMutableString 对象。 假如我们在其他的地方修改了这个 NSMutableString 对象,那么 NSString 的值会随之改变。 ; 3、对 NSMutableString 进行 copy -> 这是一个深拷贝,拷贝出来一个不可变的对象; 4、对 NSmutableString 进行 mutableCopy -> 这是一个深拷贝 //如何获取父视图 UIResponder *nextResponder = gView.nextResponder; NSMutableString *p = [NSMutableString stringWithString
非集合类对象的copy与mutableCopy //NSString & NSMutableString NSString *strA = @"origin"; NSLog [strA copy]; NSLog(@"strCopy pointer: %p content: %@", strACopy, strACopy); NSMutableString *strB = [NSMutableString stringWithString:@"mutable string"]; NSLog(@"strB pointer: %p content: %@", strB, strB); NSMutableString *strBCopy = [strB copy]; NSLog(@"strBCopy pointer: %p content: %@", strBCopy, strBCopy); NSMutableString *strBMCopy = [strB mutableCopy
Objective-C里核心的处理字符串的类就是NSString和NSMutableString这两个类,这两个类完成了Objective-C中字符串大部分功能的处理,我们今天的重点就是这两个类了。 NSMutableString是动态的字符串,可以动态的添加,修改,删除等,并且NSMutableString继承自NSString,所以NSString中的方法在NSMutableString都可以使用 *mutableStr1 = [[NSMutableString alloc] initWithCapacity:20]; //2.初始化容量为Capacity大小的字符串 (不需要手动释放内存 ) NSMutableString *mutableStr2 = [NSMutableString stringWithCapacity:20]; 2.2 可变字符串扩展方法 NSMutableString *str = [NSMutableString stringWithString:@"string"]; //////////插入////////// [str insertString
- (NSString *)stringByReversed:(NSString *)str { NSMutableString *mutableSgtr = [[NSMutableString
Foubdation框架是Cocoa编程、IOS编程的基础框架,包括代表字符串的NSString(代表字符序列不可变的字符串)、NSMutableString(代表字符序列可变的字符串),以及代表日期、 代表字符序列可变的字符串,而且NSMutableString是NSString的子类,因此前面介绍的NSString所包含的方法,NSMutableString都可以直接使用,NSMutableString 此外,NSMutableString还提供了很多可以修改字符串所包含字符序列的方法。 对象 8 NSMutableString* str = [NSMutableString 9 stringWithString:@"Hello"]; 10 * book = [NSMutableString 7 stringWithString:@"疯狂iOS讲义"]; 8 // 复制book字符串的可变副本