我将尝试对此给出详细的答案。
首先,当您使用@property/@synthesize
指令时,您会围绕变量创建 getter 和 setter 方法。
在您的情况下,变量被调用arraySpeechSentences
(编译器将为您创建变量),您可以使用self.
.
self.arraySpeechSentences = // something
是相同的
[self setArraySpeechSentences:something]; // setter
和
NSMutableArray* something = self.arraySpeechSentences;
等于
NSMutableArray* something = [self arraySpeechSentences]; // getter
在第一段代码中
NSMutableArray *speechSentences = [[NSMutableArray alloc] initWithArray:[tempDict objectForKey:key]];
arraySpeechSentences = speechSentences;
arraySpeechSentences
指向同一个对象speechSentences
指向。但是当你这样做时,你会[speechSentences release]
释放那个对象,现在arraySpeechSentences
是一个悬空指针。我想您会收到一条发送到已释放实例的消息。尝试让僵尸看到它。
就保留计数而言,当您这样做时,数组的保留计数为 1 alloc-init
。但是当你release
这样做时,保留计数变为零,对象不再存在,当你尝试访问时你会崩溃arraySpeechSentences
。
相反,当您处理属性时,应用于变量的策略很重要。由于属性使用retain
策略,当您设置对象时
self.arraySpeechSentences = // something
被引用对象的保留计数增加。在引擎盖下,说self.arraySpeechSentences = // something
等于调用 setter
- (void)setArraySpeechSentences:(NSMutableArray*)newValue
{
// pseudo code here...
if(newValue != arraySpeechSentences) {
[arraySpeechSentences release];
arraySpeechSentences = [newValue retain];
}
}
第二个片段起作用,因为您的对象的保留计数在您执行时为 1 alloc-init
,在您调用时变为 2,self.arraySpeechSentences =
并在您执行释放时返回为 1。这一次,对象保持活动状态,因为它的保留计数为 1。
如果你有一个带有retain
orcopy
策略的属性,不要忘记在dealloc
like 中释放对象,否则你可能会有泄漏。
- (void)dealloc
{
[arraySpeechSentences release];
[super dealloc];
}
要了解 Memory 的工作原理,我建议阅读MemoryManagement Apple 文档。
PS从 iOS 5 开始,有一个新的编译器功能,称为ARC(自动引用计数),可以让您忘记retain/release
调用。另外,由于它迫使您根据对象图进行思考,因此建议您看一下。
希望有帮助。