Cocoa为什么我必须保留并释放一个函数参数?

0 macos cocoa objective-c

我正在研究Aaron Hillegass的书,特别是彩票的例子.我对这个-setEntryDate:方法有疑问; 为什么我要保留date?该程序仍然有效而不保留它.

 -(void)setEntryDate:(NSCalendarDate *)date {
    [date retain];
    [entryDate release];
    entryDate = date;
}
Run Code Online (Sandbox Code Playgroud)

但这仍然可行:

-(void)setEntryDate:(NSCalendarDate *)date {
    entryDate = date;
}
Run Code Online (Sandbox Code Playgroud)

那么为什么我必须保留date然后发布entryDate呢?

Mar*_*c W 7

它现在有效,但是如果你正在编写一个更大的程序,那么在未来的某个不确定的地方,有date可能被所谓的对象指向释放setEntryDate.如果发生这种情况,它将在整个程序的其余部分失效.您将在类中保留此对象,因为该类现在拥有对该对象的引用,并需要指明该对象.通过执行此操作,即使要调用的任何类setEntryDate都要释放date,您的类仍将保持对它的有效引用.此外,这不仅仅是您正在编写的常规旧方法.这是一个setter,它负责在它所属的类上设置一个实例变量.如果您正在编写非setter方法,则可能不必保留参数.我想说的是保留方法参数并不总是必要的; 它就是在这种情况下(并且几乎所有的setter都处理非原始类型).

这就是所谓的"引用计数",并在伟大的详细解释在这里.现在,既然你刚开始学习,不要担心阅读.当您开始使用内存管理进入更复杂的场景时,该指南是非常有价值的阅读内容.