@""字符串类型并释放您不拥有问题的对象

3 iphone objective-c ipad ios

一个菜鸟问题.

如果我有一个字符串@"你好我是一个字符串".是@""一个对象?它是什么 ?它存放在哪里?

如果我发布一个我没有创建的对象会发生什么?或者它的复杂性是什么?

NSString *string1 = [[NSString alloc] initWithString:@"string"];
NSString *string2 = string1;
[string2 release];
Run Code Online (Sandbox Code Playgroud)

还有一个问题是什么区别?

NSString *string1 = [[NSString alloc] initWithString:@"string"];
NSString *string2 = @"string";
Run Code Online (Sandbox Code Playgroud)

我知道我是一个菜鸟但我只是想知道.

提前致谢

编辑:

我的意思是说init initWithString而不是stringWithString

rid*_*rid 6

永远不要释放您不拥有的对象.规则很简单:你只拥有一个对象如果通过使用得到它new,alloc,retaincopy(NARC的简称).

通过任何其他方法获得的对象应返回自动释放.这意味着该对象将在下一个自动释放池排水管上自动释放.如果你想保留对象,你需要retain它然后release它.如果您在当前范围内使用完对象后不关心对象是否已取消分配,则不要对其执行任何操作.

所以,总结一下:

  • 您必须将任何NARC与a配对 release
  • 您不得任何非NARC与a配对release
  • 非NARC方法将返回autoreleased个对象
  • 如果您需要超出当前范围,则必须使用retain任何autoreleased对象

解决您的具体问题:

  • @"Hello i am a string"是一个对象.它是一个实例,NSConstantString它在编译时创建.你不能也不应该release.它将在应用程序的整个生命周期中继续存在.看看这个问题,了解更多相关信息.
  • 如果你释放你不拥有一个对象,那么你会减少它的保持数,你将导致与假定它不能保持它的代码并发症.