Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 创建NSString指针_Objective C_Nsstring - Fatal编程技术网

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
有点奇怪,因为不可变字符串不存在