gpt4 book ai didi

objective-c - NSString分配和初始化

转载 作者:太空狗 更新时间:2023-10-30 03:24:05 25 4
gpt4 key购买 nike

有什么区别:

NSString *string1 = @"This is string 1.";

NSString *string2 = [[NSString alloc]initWithString:@"This is string 2.];

为什么我没有分配和初始化第一个字符串,但它仍然有效?我以为我应该分配 NSString 因为它是一个对象?

在 Cocoa Touch 中,

-(IBAction) clicked: (id)sender{
NSString *titleOfButton = [sender titleForState:UIControlStateNormal];
NSString *newLabelText = [[NSString alloc]initWithFormat:@"%@", titleOfButton];
labelsText.text=newLabelText;
[newLabelText release];
}

为什么我不为 titleOfButton 字符串分配和初始化?我调用的方法对我有用吗?

此外,我使用的是 XCode 4,但我不喜欢 iOS 5 等,所以如果这很重要,我不会使用 ARC。请不要说我应该,我只是来这里找出为什么会这样。谢谢!

最佳答案

变量string1 是一个NSString string literal .编译器在你的可执行文件中为它分配空间。它被加载到内存中并在程序运行时初始化。只要应用程序运行,它就会存在。您不需要保留释放它。

变量 string2 的生命周期由您决定,直至您释放 其最后一次引用为止。您为其分配空间,因此您负责在它之后进行清理。

变量 titleOfButton 的生命周期是方法 -clicked: 的生命周期。那是因为方法 -titleForState: 返回一个 autorelease-d NSString。一旦您离开该方法的范围,该字符串将自动释放。

您不需要创建 newLabelText。该步骤是多余且困惑的。只需将 labelsText.text 属性设置为 titleOfButton:

labelsText.text = titleOfButton;

为什么要使用属性?因为设置此 retain 属性会将 titleOfButton 的引用计数增加一(这就是为什么它被称为 retain 属性),所以字符串titleOfButton 指向的对象将在 -clicked: 结束后继续存在。

在此示例中考虑使用 retain 的另一种方法是 labelsText.text 正在“取得”titleOfButton< 指向的字符串的所有权。只要 labelsText 存在,该字符串就会一直存在(除非其他一些变量也拥有该字符串的所有权)。

关于objective-c - NSString分配和初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9254502/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com