Objective c 创建NSString指针
考虑:Objective c 创建NSString指针,objective-c,nsstring,Objective C,Nsstring,考虑: NSString*test2=[[NSString alloc]init]; test2=@"yo"; NSString *test= test2; NSLog(@"test: %@ test2: %@",test, test2); test2=@"what the?"; NSLog(@"test: %@ test2: %@",test, test2); 输出: 2012-11-14 09:50:26.720 testt[693:c07] test: yo test2: yo 2
NSString*test2=[[NSString alloc]init];
test2=@"yo";
NSString *test= test2;
NSLog(@"test: %@ test2: %@",test, test2);
test2=@"what the?";
NSLog(@"test: %@ test2: %@",test, test2);
输出:
2012-11-14 09:50:26.720 testt[693:c07] test: yo test2: yo
2012-11-14 09:50:26.721 testt[693:c07] test: yo test2: what the?
如何使
test
成为真正的指针,这样当test2
发生变化时,test
也会发生变化?我会尝试以下方法:
NSString *test = &test2;
我会尝试以下方法:
NSString *test = &test2;
您已经创建了一个“真指针”,问题是语句:
test2 = @"What the?";
正在创建一个新字符串对象并将指向新字符串的指针分配到变量test2
,test
仍包含旧指针
您可以创建指向解决此问题的指针的指针。或者,您可以使用NSMutableString
,然后仅使用NSMutableString
方法更改(变异)字符串,而不是将新值重新分配给test
和test2
变量
以下是示例的NSMutableString
版本:
NSString *test2 = [[NSMutableString alloc] initWithString:@"yo"];
NSString *test = test2;
NSLog(@"test: %@ test2: %@", test, test2);
[test2 setString:@"what the?"];
NSLog(@"test: %@ test2: %@", test, test2);
它产生输出:
2012-11-14 10:06:27.231 Untitled 2[592:707] test: yo test2: yo
2012-11-14 10:06:27.232 Untitled 2[592:707] test: what the? test2: what the?
NSString
s在Objective-C中有一些额外的语法糖,因此以下两种语言具有相同的效果(尽管背景中发生的事情可能完全不同或相同)
这两条语句都创建一个新的不可变(不可更改)字符串。使用语句[NSString alloc]init]
创建一个NSString
会创建一个空字符串,这通常不是您想要做的
这意味着,在您的示例中,前两行是:
NSString*test2=[[NSString alloc]init];
test2=@"yo";
第一行是不必要的,因为您正在创建字符串对象并将指针放在test2
中,然后立即用指向@“yo”
创建的字符串的指针覆盖该指针。如果不使用ARC,这将导致内存泄漏,因为[[NSString alloc]init]
创建的字符串尚未释放。但是,NSString
实际上与其他对象的工作原理不同,因此与其说内存泄漏,不如说您在浪费内存“您创建了一个“真正的指针”,问题在于:
test2 = @"What the?";
正在创建一个新字符串对象并将指向新字符串的指针分配到变量test2
,test
仍包含旧指针
您可以创建指向指针的指针来解决此问题。或者,您可以使用NSMutableString
,然后仅使用NSMutableString
方法更改(变异)字符串,而不是将新值重新分配给test
和test2
变量
以下是示例的NSMutableString
版本:
NSString *test2 = [[NSMutableString alloc] initWithString:@"yo"];
NSString *test = test2;
NSLog(@"test: %@ test2: %@", test, test2);
[test2 setString:@"what the?"];
NSLog(@"test: %@ test2: %@", test, test2);
它产生输出:
2012-11-14 10:06:27.231 Untitled 2[592:707] test: yo test2: yo
2012-11-14 10:06:27.232 Untitled 2[592:707] test: what the? test2: what the?
NSString
s在Objective-C中有一些额外的语法糖,因此以下两种语言具有相同的效果(尽管背景中发生的事情可能完全不同或相同)
这两条语句都会创建一个新的不可变(不可更改)字符串。使用语句[NSString alloc]init]
创建一个空字符串通常不是您想要的
这意味着,在您的示例中,前两行是:
NSString*test2=[[NSString alloc]init];
test2=@"yo";
第一行是不必要的,因为您正在创建字符串对象,并将指针放在
test2
中,然后立即用指向@“yo”
创建的字符串的指针覆盖该指针。如果不使用ARC,这将导致内存泄漏,因为[[NSString alloc]init]创建的字符串会导致内存泄漏
尚未发布。但是,NSString
与其他对象的工作原理并不完全相同,因此与其泄漏内存,不如说您在浪费内存“NSString*test2
已经是一个指针。”。您需要将test
指针设置为指向指针(双*
),并使用&
前缀为其分配test2
的地址,然后使用*
前缀访问该值。我很难解释这一点,下面是代码:
test2=@"yo";
NSString **test= &test2;
NSLog(@"test: %@ test2: %@", *test, test2);
test2=@"what the?";
NSLog(@"test: %@ test2: %@", *test, test2);
NSString*test2
已经是指针。您需要将test
指针设置为指向指针(双*
),并使用&
前缀为其分配test2
的地址,然后使用*
前缀访问该值。我很难解释这一点,下面是代码:
test2=@"yo";
NSString **test= &test2;
NSLog(@"test: %@ test2: %@", *test, test2);
test2=@"what the?";
NSLog(@"test: %@ test2: %@", *test, test2);
您需要使用指向指针的指针,因为“test”已经是指针。您需要使用指向指针的指针,因为“test”已经是指针。NSMutableString可能是更好的解决方案,是的。我想知道OP想要实现什么。我只是想了解字符串和指针在目标C中是如何工作的。这是一个比任何事情都重要的练习。关于你关于“额外语法糖”的观点,第一个对
init
的显式调用现在正在创建所有权,而第二个是=@“yo”
不是,因此第二种方法不存在内存泄漏问题,而如果您不在非Arc环境中释放
,则第一种方法存在风险,对不对?NSString
有点奇怪,因为不可变的字符串实际上并不遵循相同的保留/释放周期。使用retainCount
是一个坏主意,但是在NSString的情况下retainCount
返回-1
。NSMutableString可能是一个更好的解决方案,是的。我想知道OP想要实现什么。我只是想了解字符串和指针在目标C中是如何工作的。这是一个比任何事情都重要的练习。关于你关于“额外语法糖”的观点,第一个对init
的显式调用现在正在创建所有权,而第二个是=@“yo”
不是,因此第二种方法不存在内存泄漏问题,而如果您在非Arc环境中不释放
,则第一种方法存在风险,对吗?NSString
有点奇怪,因为不可变字符串不存在