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];
情况#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,因为如果需要,它会自动执行以下步骤:
foobarfoo给bar在分配foo = bar和foo = [bar retain]不释放以前的对象foo.
| 归档时间: |
|
| 查看次数: |
390 次 |
| 最近记录: |