gpt4 book ai didi

objective-c - 如何为已创建但未分配给任何指针的对象管理内存?

转载 作者:行者123 更新时间:2023-12-04 04:51:30 26 4
gpt4 key购买 nike

这可能是一个愚蠢的问题,但它一直困扰着我。

假设我们有一个接受 NSString 的方法对象作为其参数并使用 NSString 做一些事情目的,

- (void)someMethod:(NSString *)str
{
//do something with str
}

考虑这个代码
[someObject someMethod:[[NSString alloc] initWithFormat:@"Hello World!"]];

alloc已用于创建字符串作为 someMethod 的参数,它必须由 release 平衡无论是在 ARC 之前的环境中显式还是在 ARC 下隐式。但似乎我们无法获得指向字符串的指针,因为我们从未将其分配给任何指针。

所以我的问题是,首先,在编写客观的c代码时是否禁止这种传递参数的方式?如果不是,那么以这种方式创建的对象如何被释放?最后,这段代码会导致内存泄漏吗?

只是为了记录,我理解上面的代码是这样写的
NSString *string = [[NSString alloc] initWithFormat:@"Hello World!"];
[someObject someMethod:string];
// [string release]; depending on ARC or non-ARC

最佳答案

好吧,实际上,该对象已分配给名为 str 的变量。 ,这是您的方法的参数。您可以通过该指针管理方法内部的内存,尽管方法不应该拥有其参数的所有权(除非见下文)。

ARC 知道在这种情况下该做什么——它要么自动释放对象,要么在方法完成后添加一个释放。

在 MRR 下,您的代码段将是泄漏;避免这种情况的正确方法也是发送 autorelease :

[someObject someMethod:[[[NSString alloc] initWithFormat:@"Hello World!"] autorelease]];

或使用您的最后一个片段(将字符串放入临时变量并稍后释放)。

作为一个稍微深奥的选项,您的方法可以通过使用 ns_consumed 声明它拥有参数。属性:
- (void)someMethod:(NSString *) __attribute__((ns_consumed)) str;

这表明您的方法应该发送 release在它返回之前到对象 - ARC 也会处理这个。

关于objective-c - 如何为已创建但未分配给任何指针的对象管理内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17373120/

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