繁体   English   中英

关于Objective-C中的复制属性

[英]About copy property in Objective-C

我测试了此示例代码。

Sample.h

 {

    NSString *string1;
    NSString *string2;
    NSMutableString *string3;
}

@property (assign) IBOutlet NSWindow *window;
@property (strong,nonatomic) NSString *string1;
@property (copy,nonatomic) NSString *string2;
@property (strong,nonatomic) NSMutableString *string3;

@end

Sample.m

#import "Sample.h"

@synthesize string1;
@synthesize string2;
@synthesize string3;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    string1 = [[NSString alloc] init];
    string2 = [[NSString alloc] init];
    string3 = [[NSMutableString alloc] initWithString:@"test"];
    string2 = string3;
    string1 = string3;
    [string3 appendString:@"test"];
    NSLog(@"%@",string1);
    NSLog(@"%@",string2);
    NSLog(@"%@",string3);

}

@end

结果是

2012-09-23 00:11:48.610 sample[13468:303] testtest
2012-09-23 00:11:48.611 sample[13468:303] testtest
2012-09-23 00:11:48.611 sample[13468:303] testtest

我认为string2应该是“测试”,因为该属性是副本。 但是string2是“ testtest”。

string2 = [string3 copy];

我认为这是结果。

string2 is "test"

为什么? 请告诉我,我睡不好觉。

问题在于您没有访问属性,而是立即操作了后台实例变量。 对于这些ivars, =运算符不是特殊的, 并且不具有调用setter方法的效果 ,它只是常规的指针分配。 所以当你写

string2 = string3;
string1 = string3

然后您将指向string3的指针分配给string1string2不管您对string3做什么,它也将对其他两个变量有效,因为实际上它们指向的是同一字符串实例

您要做的是,一,将属性声明为copy而不是strong ,二,编写

self.string2 = string3;
self.string1 = string3

为了调用setter方法并实际制作字符串的独立副本。

P.s. 通过使用以下命令创建两个NSString空实例

string1 = [[NSString alloc] init];
string2 = [[NSString alloc] init];

代码,然后将其他内容重新分配给这些变量,您正在泄漏内存。

编辑:您很幸运,但您不幸运-通过使用ARC。 使用旧的运行时,您将浪费用户RAM的宝贵字节。

但是还是。 您无需创建这些实例-您无需直接使用memcpy()将字符放入预分配的内存中。 在深入研究iOS开发之前,请阅读有关C指针的综合教程。

我不确定为什么您说string2属性上的setter语义是copy 你宣称它strong

您将NSString指针string2设置为NSMutableString指针string3。 然后,您继续修改string3指向的可变字符串。 因此,您应该期望string2能够反映出来。

顺便说一下,这就是为什么您应该在具有可变对应项的对象上使用copy设置器语义的主要原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM