gpt4 book ai didi

iphone - iPhone 版 Cocoa 中的释放/自动释放困惑

转载 作者:行者123 更新时间:2023-12-03 16:09:55 26 4
gpt4 key购买 nike

我正在慢慢自学 iPhone 的 cocoa (通过 Stanford Class on iTunes U ),我刚刚完成了内存管理部分,我希望得到一些确认,以证明我所做的假设内存的处理方式以及 [release] 和 [autorelease] 如何工作。由于内存管理是编程体验中非常基础且重要的部分,因此我想确保我做得正确。

我知道任何带有分配、新建或副本的内容都需要释放。
如果我这样做:

NSString *temp = [[NSString alloc] initWithString:@"Hello World"];

然后我最终需要添加[临时释放/自动释放],因为我有一个分配。

但是,如果我这样做:

NSString *temp = @"Hello World";

那么它似乎不需要发布声明。 NSString 类是否会在赋值过程中自动调用 autorelease?

此外,这些语句之后的两个 *temp 对象有什么区别吗?它们都包含相同的字符串,但是它们的内存/使用方式是否有所不同?

其次,对于属性,我假设自动释放是自动处理的。如果我有这个:

@interface Person : NSObject
{
//ivars
NSString *firstName;
NSString *lastName;
}

//properties
@property NSString *firstName;
@property NSString *lastName;

///next file

@implementation Person

@synthesize firstName;
@synthesize lastName;

- (void) dealloc
{

//HERE!!!!

[super dealloc];
}

我假设我不需要添加 [firstName release] 和 [lastName release] (在//HERE!!!),因为这是由属性自动处理的。这是正确的吗?

我确实明白,如果我在代码中执行此操作(假设我已经定义了 initWithFirstName):

Person *Me = [[Person alloc] initWithFirstName: @"Drew", lastName:"McGhie"];

稍后我将不得不使用 [Me release/autorelease];

到目前为止,任何确认或纠正我的理解的帮助都非常感谢。

POST ANSWER WRITE-UP

我想在浏览完所有答案并测试建议并讨论有效的方法后,我应该把这一切写下来。

我确实需要添加 [firstName release]、[lastName release],但我还需要添加(保留)到属性描述。不添加(保留)会导致警告,因为它假设(分配)。这是我最终设置类(class)的方式

@interface Person : NSObject
{
//ivars
NSString *firstName;
NSString *lastName;
}

//properties
@property (retain) NSString *firstName;
@property (retain) NSString *lastName;

///next file

@implementation Person

@synthesize firstName;
@synthesize lastName;

- (void) dealloc
{
[firstName release];
[lastName release];
[super dealloc];
}

最佳答案

规则很简单:如果您分配复制保留,则您有责任释放。如果你没有,那就不是。但是,如果您需要依赖某个对象,则必须保留(然后释放)。

我们可以根据规则处理字符串文字 - 您不需要释放它,因为您不拥有它。这很简单;不用担心是否是特殊情况,只要遵守规则就可以了。

我写了一篇博文,其中包含 articles about the Cocoa memory management rules 的集合;我建议跟进一些引用资料。

关于iphone - iPhone 版 Cocoa 中的释放/自动释放困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1121343/

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