更具体,一般的Objective-C内存管理

Soo*_*uNe 2 memory-management objective-c

我读到的关于objective-c内存管理的所有内容都让人觉得难以置信.用大家的意思来说:"释放你分配,保留或复制的任何内容".但我认为还有一些更具体的案例并不那么明确.以下是一些示例情况.每个的正确程序是什么:

情况#1:

Foo *foo = [[foo alloc] init];
Foo *fooToo = [[[foo alloc] init] autorelease];

foo = fooToo;
Run Code Online (Sandbox Code Playgroud)

foo在被分配给fooToo之前是否需要被释放?

情况#2 当我做以下事情时,我似乎遇到了很多崩溃:(.为了方便而将.h和.m混合在一起)

Foo *foo;
@property (nonatomic, retain) Foo *foo;
@synthesize foo;

-(id)init{
self = [super init];
}

-(void)dealloc{
[super dealloc];
[foo release];
}
Run Code Online (Sandbox Code Playgroud)

我经常被告知"总是在dealloc中释放你设置的保留属性".但如果像我所示的那样完成,这将会崩溃.

情况#3 类似的情况也将崩溃:( .h和.m为了方便而混合在一起)

Foo *foo;
@property (nonatomic, retain) Foo *foo;
@synthesize foo;

-(id)init{
self = [super init];
self.foo = nil;
}

-(void)dealloc{
[super dealloc];
[foo release];
}
Run Code Online (Sandbox Code Playgroud)

出于某种原因,当我的代码归结为dealloc时,foo不是== nil.

情况#4 最后,只是一个问题,人们在决定之间使用什么样的一般思维过程

 self.foo = bar;
Run Code Online (Sandbox Code Playgroud)

 foo = bar;
Run Code Online (Sandbox Code Playgroud)

当foo声明与上述情况相同时?是self.foo编码的另一种方式:

foo = [bar retain];

not*_*oop 6

情况#1:

是的,您需要foo在失去对它的引用之前发布.鉴于您已分配它,您有责任释放它.如果foo在发布之前重新分配,则无法再释放它!

情况#2:

正确实施dealloc是:

- (void)dealloc {
    [foo release];
    [super dealloc];
}
Run Code Online (Sandbox Code Playgroud)

dealloc方法需要调用super的dealloc方法而不是release方法.此外,您需要在呼叫前先释放字段[super dealloc]

情况#3:与情况#2相同.

情况#4:

我总是喜欢使用self.foo = bar,因为如果需要,它会自动执行以下步骤:

  1. 释放 foo
  2. 固定 bar
  3. 分配foobar

在分配foo = barfoo = [bar retain]不释放以前的对象foo.