在iphone的可可中释放/自动释放混淆

我正在慢慢地教自己可爱的iPhone(通过 Stanford Class on iTunes U),我刚刚完成了关于内存管理的部分,我希望能够得到一些确认,我正在假设如何处理内存以及如何处理[发布]和[autorelease]工作.由于内存管理是编程体验中一个非常基础和基础但非常重要的部分,我想确保我做得对.

我知道任何带有alloc,new或copy的东西都需要发布.
如果我这样做:

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

然后我需要最终添加[temp release / autorelease],因为我有一个alloc.

但是,如果我这样做:

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"];

以后我将不得不使用[我发布/自动发布];

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

POST ANSWER WRITE-UP

我想在完成所有答案并测试建议并谈论有效之后我会写下这一切.

我确实需要添加[firstName release],[lastName release],但我还需要添加(保留)属性描述.不添加(保留)引起的警告,因为它假定(赋值).这是我最终设置课程的方式

@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;我建议跟进一些参考文献.

相关文章

我正在用TitaniumDeveloper编写一个应用程序,它允许我使用Ja...
我的问题是当我尝试从UIWebView中调用我的AngularJS应用程序...
我想获取在我的Mac上运行的所有前台应用程序的应用程序图标....
我是一名PHP开发人员,我使用MVC模式和面向对象的代码.我真的...
OSX中的SetTimer在Windows中是否有任何等效功能?我正在使用...
我不确定引擎盖下到底发生了什么,但这是我的设置,示例代码和...