【问题标题】:Does NSArray initWithObjects: retain objects?NSArray initWithObjects: 是否保留对象?
【发布时间】:2010-10-27 18:08:22
【问题描述】:

当使用“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];

干杯加里

【问题讨论】:

    标签: iphone objective-c cocoa-touch


    【解决方案1】:

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

    initWithObjects:计数:

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

    这是该类的指定初始化程序。 子类必须重写此方法。 这应该使用计数(可能为零)对象初始化数组。 保留放置在数组中的每个对象。 调用 -init(除了保持 MacOS-X 兼容性之外什么都不做),并且需要在子类中重新实现才能让所有其他初始化程序正常工作。

    【讨论】:

    • 我似乎没有从 Xcode 文档中获得该描述,initWithObjects:count:(NSSet) 的文档提到了保留,但没有提到 NSArray。我想 Chuck 指出了它的标准做法,并没有在任何地方明确提及。非常感谢...
    • @fuzzygoat:文档不需要为每种方法再次指定它。通用内存管理规则非常简单和简短;方法退出后要保留的任何对象参数都应保留,除非它是委托。 Apple 的文档通常只记录此规则的少数例外情况(NSNotificationCenter 观察者和CALayer 代表)。
    【解决方案2】:

    对象应该拥有他们需要保留的东西的所有权。数组负责其项目,因此它保留它们。有关完整详细信息,请参阅memory management guide。 (不,认真地阅读它。稍后您会感谢自己,因为您不必就您使用的每个课程都问这个问题,并且您的程序不会每五秒崩溃一次。)

    【讨论】:

    • 谢谢,今晚我再看看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多