我对 Objective-C 中的属性和实例变量感到相当困惑。
我正在阅读 Aaron Hillegass 的“Mac OS X 的 Cocoa 编程”,一切都很合乎逻辑。你可以像这样声明一个类:
@class Something;
@interface MyClass : NSObject {
NSString *name;
NSArray *items;
Something *something;
IBOutlet NSTextField *myTextField;
}
@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSArray *items;
由于其他对象需要操纵我们的name
and items
实例变量,我们使用@property
/@synthesize
为它们生成访问器/修改器。在我们的类中,我们不使用访问器/修改器——我们只是直接与实例变量交互。
something
只是我们将在类中使用的一个实例变量,并且由于没有其他人需要使用它,因此我们不会为它创建一对访问器和修改器。
我们需要与 UI 中的文本字段进行交互,因此我们声明一个IBOutlet
对于它,连接它,我们就完成了。
一切都非常合乎逻辑。
然而,在iPhone世界里,情况似乎有所不同。人们为每个实例变量声明属性,为IBOutlets
,并使用访问器/修改器与实例变量交互within班级(例如,他们会写[self setName:@"Test"]
而不是name = @"Test"
).
为什么?到底是怎么回事?这些差异是 iPhone 特有的吗?为所有实例变量声明属性有什么好处,为IBOutlets
,并在您自己的类中使用访问器/修改器?
在 iPhone 世界中,没有可用的垃圾收集器。您必须通过引用计数仔细管理内存。考虑到这一点,请考虑以下之间的区别:
name = @"Test";
and
self.name = @"Test";
// which is equivalent to:
[self setName: @"Test"];
如果您直接设置实例变量,而不事先考虑,您将丢失对先前值的引用,并且无法调整其保留计数(您应该有release
手动进行)。如果您通过属性访问它,它将自动为您处理,同时增加新分配对象的保留计数。
基本概念不是 iPhone 特有的,但在没有垃圾收集器的环境中它变得至关重要。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)