大佬教程收集整理的这篇文章主要介绍了ios – 使用“copy”属性属性来维护不可变的NSString,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
这是我想要了解的当前练习.
3.测试如果将可变字符串设置为该人的名字会发生什么,然后在调用修改后的sayHello方法之前改变该字符串.通过添加copy属性更改NSString属性声明并再次测试.
我尝试这样做,但是我修改的NSString实际上改变了,尽管使用了copy属性.
这是我的声明和实现以及我的测试代码.
XYZPerson.h #import <Foundation/Foundation.h> @interface XYZPerson : NSObject @property (copy) NSString *firstName; @property NSString *lastName; @property NSDate *dob; - (void)sayHello; - (void)saySomething:(NSString *)greeTing; + (id)init; + (id)personWithFirstName:(NSString *)firstName lastName:(NSString *)lastName dob:(NSDate *)dateOfBirth; @end //XYZPerson.m #import "XYZPerson.h" @implementation XYZPerson @synthesize firstName = _firstName; @synthesize lastName = _lastName; @synthesize dob = _dob; - (void)sayHello { [self saySomething:@"Hello World!"]; NSLog(@"This is %@ %@",self.firstName,self.lastName); } - (void)saySomething:(NSString *)greeTing { NSLog(@"%@",greeTing); } + (id)init { return [self personWithFirstName:@"Yorick" lastName:@"Robinson" dob:8/23/1990]; } + (id)personWithFirstName:(NSString *)firstName lastName:(NSString *)lastName dob:(NSDate *)dateOfBirth{ XYZPerson *person = [[self alloc] init]; person.firstName = firstName; person.lastName = lastName; person.dob = dateOfBirth; return person; } @end //Test code #import <UIKit/UIKit.h> #import "AppDelegate.h" #import "XYZPerson.h" #import "XYZShoutIngPerson.h" int main(int argc,char *argv[]) { @autoreleasepool { XYZPerson *guy = [XYZPerson init]; [guy sayHello]; //I thought that this change would never be made,but it is everytime I run the code. guy.firstName = @"Darryl"; [guy sayHello]; XYZShoutIngPerson *girl = [XYZShoutIngPerson init]; [girl sayHello]; return UIApplicationMain(argc,argv,nil,NSStringFromClass([AppDelegate class])); } }
#import <Foundation/Foundation.h> @interface Person : NSObject @property (nonatomic,strong) NSString *name; // strong should be copy @end @implementation Person @end int main(int argc,char *argv[]) { @autoreleasepool { Person *p = [Person new]; NSMutableString *name = [[NSMutableString alloc] initWithString:@"Alice"]; p.name = name; NSLog(@"%@",p.Name); // prints Alice [name appendString:@"xxx"]; NSLog(@"%@",p.Name); // prints Alicexxx } }
我将名称指向一个可变字符串,然后附加一些字符.结果,名称在对象内部发生了变化.但是,如果在声明属性时将strong替换为copy,则将仅为Person对象创建新的不可变字符串.
故事的寓意是,当有人传递一个物体然后该物体发生变化时,使用副本可以防止副作用.
消息 – [NSString copy]在传递可变字符串(NSMutableString)时生成副本,或者在不可变(NSString)时保留.因此,在声明NSString属性时始终复制:
@property (nonatomic,copy) NSString *String; // OK @property (nonatomic,strong) NSString *String; // strong should be copy
以上是大佬教程为你收集整理的ios – 使用“copy”属性属性来维护不可变的NSString全部内容,希望文章能够帮你解决ios – 使用“copy”属性属性来维护不可变的NSString所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。