NSArray initWithObjects:是否会保留对象?

4

当使用“initWithObjects”向NSArray添加对象时,是否有人可以确认这些项目已被保留。我相信它们是被保留的,但在initWithObjects方面找不到任何提及吗?

// CREATE DRINKS
Coffee *drink1 = [[Coffee alloc] initWithName:@"Flat White"];
Coffee *drink2 = [[Coffee alloc] initWithName:@"Cappucino"];
Coffee *drink3 = [[Coffee alloc] initWithName:@"Latte"];
Coffee *drink4 = [[Coffee alloc] initWithName:@"Mocha"];
Coffee *drink5 = [[Coffee alloc] initWithName:@"Hot Chocolate"];

// SET ARRAY
NSArray *tempArray = [[NSArray alloc] initWithObjects:drink_1, drink_2, drink_3, drink_4, drink_5, nil];
[self setCoffeeList:tempArray];

// CLEAN UP
[drink_1 release];
[drink_2 release];
[drink_3 release];
[drink_4 release];
[drink_5 release];
[tempArray release];
[super viewDidLoad];

祝福Gary

2个回答

6

initWithObjects会保留数组中的所有项目。

initWithObjects: count:

  • (id) initWithObjects: (id*)objects count: (NSUInteger)count; 可用性:OpenStep

这是该类的指定初始化方法。 子类必须重写此方法。 这应该使用计数(可以是零)对象初始化数组。 保留放置在数组中的每个对象。 调用-init(仅维护MacOS-X兼容性,不做任何事情),需要在子类中重新实现才能使所有其他初始化程序起作用。


我在Xcode文档中似乎找不到那个描述,initWithObjects:count:(NSSet)的文档提到了retain,但没有提到NSArray。我猜正如Chuck所指出的那样,这是标准做法,并不是到处都明确提到的。非常感谢... - fuzzygoat
@fuzzygoat:文档不应该每个方法都再次指定它。通用的内存管理规则非常简单和短,即在方法退出后要保留任何对象参数,除非它是代理。苹果的文档通常只记录了这个规则的少数例外(NSNotificationCenter观察者和CALayer代理)。 - PeyloW

4

对象应该拥有它们需要保留的东西。数组负责它的项,因此它会保留它们。完整详情请参见内存管理指南。(不要开玩笑,请认真阅读。当您使用每个类时不再需要询问此问题且程序不再每五秒钟崩溃时,您将感谢自己。)


谢谢,我今晚会再看一遍。 - fuzzygoat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接