gpt4 book ai didi

objective-c - @synthesized 保留属性的释放是如何处理的?

转载 作者:IT老高 更新时间:2023-10-28 11:27:16 25 4
gpt4 key购买 nike

我对 Objective-C 中的综合属性有一些疑问。完整列表如下,但基本问题是:编译器如何确保合成属性的 ivars 被正确释放,即使我的代码可能包含也可能不包含在 dealloc 中的释放方法?

注意:我决定不将这些问题作为单独的问题发布,因为它们之间的关系非常密切,并且因为现有的一些问题触及个别问题而没有真正触及问题的核心问题。

有些类似的问题:


设置:考虑一个具有单个属性的类:

@interface Person : NSObject
{
NSString * name;
}
@property (nonatomic, retain) name;
@end

问题 #1: 非常基本的案例:

@implementation Person
@synthesize name;
@end

使用此设置,我假设只要释放 Person 对象,就会自动释放 name。在我看来,编译器只是将 [name release] 插入到 dealloc 方法中,就好像我自己键入一样。对吗?


问题 #2: 如果我选择为这个类编写自己的 dealloc 方法,并且我省略了对 [name release] 的调用>,会不会漏水?

@implementation Person
@synthesize name;
- (void)dealloc { [super dealloc]; }
@end

问题 #3: 如果我选择为这个类编写自己的 dealloc 方法,并且我包含一个对 的调用[name release],这会导致双重发布吗,因为 @synthesize 已经为我处理好了?

@implementation Person
@synthesize name;
- (void)dealloc { [name release]; [super dealloc]; }
@end

问题 #4: 如果我选择为此类编写自己的属性访问器,但我编写自己的 dealloc 方法,name会泄露吗?

@implementation Person
@dynamic name;
- (void)setName:(NSString *)newName
{
[newName retain];
[name release];
name = newName;
}
@end

问题 #5:我有一种感觉(根据经验)没有上述情况会导致泄漏或双重发布,因为语言已经旨在避免它们。当然,这提出了“如何?”的问题。编译器是否足够聪明以跟踪所有可能的情况?如果我要执行以下操作(请注意,这是一个荒谬的示例,只是为了说明我的观点):

void Cleanup(id object) { [object release]; }

@implementation Person
@synthesize name;
- (void)dealloc { Cleanup(name); }
@end

这会欺骗编译器向 dealloc 方法添加另一个 [name release] 吗?

最佳答案

第一季度:

没有。 @synthesize 不会为您修改 -dealloc。你必须自己-release name

第二季度:

是的,它会泄漏。原因与第一季度相同。

第三季度:

不,它不会双重释放。原因与第一季度相同。

第四季度:

是的,它会泄漏。原因与第一季度相同。

Q5:

不,它不会双重释放。原因与第一季度相同。


您可以通过覆盖 -retain-release-dealloc 自行检查以报告发生的情况。

#import <Foundation/Foundation.h>

@interface X : NSObject {}
@end
@implementation X
-(oneway void)release {
NSLog(@"Releasing %p, next count = %d", self, [self retainCount]-1);
[super release];
}
-(id)retain {
NSLog(@"Retaining %p, next count = %d", self, [self retainCount]+1);
return [super retain];
}
-(void)dealloc {
NSLog(@"Dealloc %p", self);
[super dealloc];
}
@end

@interface Y : NSObject {
X* x;
}
@property (nonatomic, retain) X* x;
@end
@implementation Y
@synthesize x;
- (void)dealloc { [x release]; [super dealloc]; }
@end

int main () {
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
Y* y = [[Y alloc] init];
X* x = [[X alloc] init];
y.x = x;
[y release];
[x release];
[pool drain];
return 0;
}

Q1、Q2、Q4中,x最后一个-retainCount为1,所以有泄漏,Q3、Q5最后一个- retainCount 为0,调用了-dealloc,所以没有泄漏。

关于objective-c - @synthesized 保留属性的释放是如何处理的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2189919/

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