使用@property和@synthesize时防止泄漏

发布于 2024-12-01 22:07:30 字数 88 浏览 1 评论 0原文

在使用 @property@synthesize 时,我们应该采取哪些步骤(最佳实践是什么)来防止泄漏?

What steps should we take -- what are the best practices -- to prevent leaks when using @property and @synthesize?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

心的位置 2024-12-08 22:07:30

请注意您的标准事物,这些事物会返回保留的对象、带有 alloc、copy 或 new 的方法。当您将这些与您的属性一起调用时,您可能会无意中造成泄漏。

在你的接口中你有

@property (nonatomic, retain) NSArray *someArray;

,在你的实现中你有

@synthesize someArray;

然后你使用

self.someArray = [[NSArray alloc] init];

你的对象现在的保留计数为2的属性。一个来自使用self.someArray =,一个来自alloc。 self.someArray = 调用与 - (void)setSomeArray:(NSArray)someArray 相同的 setter;这是通过合成为您创建的。由于@property 声明中使用了retain 关键字,因此它将包含retain。

我倾向于通过以下两种方式之一来避免这种情况。

无论是使用自动释放的初始化程序

self.someArray = [NSArray array];

还是

self.someArray = [[[NSArray alloc] init] autorelease];

使用临时变量,

NSArray tempArray = [[NSArray alloc] init];
self.someArray = tempArray;
[tempArray release];

所有这些方法都会让您的 self.someArray 对象的保留计数为 1,您可以在 dealloc 中处理该对象。

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

Be aware of your standard things that give you back retained objects, methods with alloc, copy or new. When you invoke these along with your property you can inadvertently create a leak.

In your interface you have

@property (nonatomic, retain) NSArray *someArray;

And in your implementation you have

@synthesize someArray;

Then later on you use the the property

self.someArray = [[NSArray alloc] init];

your object now has a retain count of 2. one from using self.someArray = and one from the alloc. self.someArray = invokes your setter which is the same as - (void)setSomeArray:(NSArray)someArray; which is created for you with the synthesize. This is going to contain a retain because of the retain keyword you used in the @property declaration.

I tend to avoid this one of two ways.

either with using the autoreleased intializer

self.someArray = [NSArray array];

or

self.someArray = [[[NSArray alloc] init] autorelease];

or use a temp variable

NSArray tempArray = [[NSArray alloc] init];
self.someArray = tempArray;
[tempArray release];

all of these methods will leave you with your self.someArray object having a retain count of one which you can take care of in the dealloc.

- (void)dealloc {
[someArray release];
[super dealloc];
}
转角预定愛 2024-12-08 22:07:30

对我帮助很大的一件事是检查头文件中是否有保留类型的属性定义,然后确保 -dealloc 方法中每个属性都有一个版本。

对于对象生命周期内对属性的各种分配,自动合成的设置器应该处理它。

One thing that has helped me a lot is to check your header file for property definitions with a retain type, and then make sure that there is a release for each of them in the -dealloc method.

For the various assignments to the properties during the lifetime of the object, the automatic synthesized setters should take care of it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文