据我所知,使用allocnewcopy创建的任何东西都需要手动释放.例如:

int main(void) {
    NSString *string;
    string = [[NSString alloc] init];
    /* use the string */
    [string release];
}

但我的问题是,这难道不是同样有效吗

int main(void) {
    NSAutoreleasePool *pool;
    pool = [[NSAutoreleasePool alloc] init];
    NSString *string;
    string = [[[NSString alloc] init] autorelease];
    /* use the string */
    [pool drain];
}

推荐答案

是的,你的第二个代码snippit完全有效.

每次将-autorelease发送到对象时,它都会添加到最内部的autorelease池中.当池排空时,它只向池中的所有对象发送-release.

自动释放池只是一种方便,允许您将发送-释放延迟到"以后".这种"以后"的情况可能会在几个地方发生,但在Cocoa GUI应用程序中最常见的情况是在当前运行循环周期的末尾.

Objective-c相关问答推荐

在 MacOS 上截屏

NSViewController 中的 viewDidLoad?

如何获取 NSDictionary 中的第一个元素?

在从 UIViewController 调用的非保留完成中引用 self 时,weakSelf/strongSelf 舞蹈真的有必要吗?

在 Objective C 中动态调用类方法

使用自动布局以编程方式更改框架

滚动 NSScrollView 时的回调?

如何调整 UIModalPresentationFormSheet 的大小?

如何以编程方式退出 mac 应用程序?

判断 NSInteger 是奇数还是偶数

如何删除应用程序指定目录中的所有文件?

类在两者中都实现.将使用两者之一

MKAnnotation 图像偏移与自定义引脚图像

如何判断数组是空还是空?

根据文本量更改 UITableViewCell 高度

如何为 iPhone 6/7 自定义边到边图像指定尺寸?

UITableView ,重新加载时滚动到底部?

状态栏文本 colored颜色 iOS 7

围绕其中心旋转 UIView 保持其大小

按字典中键的值对字典的 NSArray 进行排序