分配仅在该类中使用的ivar时,是否需要临时变量?

时间:2011-09-24 20:18:42

标签: iphone

如果其他类使用了ivar,我使用@property(noatomic,retain)和@synthesize。 我将它添加到这样的视图中。标签是ivar。

UILabel *aLabel = [UILabel alloc] initWithFrame:frame];
self.label = aLabel;
[aLabel release];
[self.view addSubview:label];

但是如果其他类没有使用它,我不使用@property和@synthesize。 我将它添加到这样的视图中。

label = [UILabel alloc] initWithFrame:frame];
[self.view addSubview:label];

我是对的吗?

4 个答案:

答案 0 :(得分:0)

是的,但第一个例子的最后一行应该是

[self.view addSubview:self.label];

答案 1 :(得分:0)

是的,不要忘记在dealloc发布。属性主要是允许从类外部访问值的必要条件。本质上是方法,一个getter和一个传递值的setter。保留和复制属性还可以保留值或复制它。因此,如果您需要保留某些内容,它们通常用于简化代码,因为您可以简单地设置self.property = value,而不需要显式保留它并释放以前的值。

答案 2 :(得分:0)

在这两种情况下都应该使用@property。不同之处在于,如果您不想将其公开,则应将@property定义移动到私有扩展中。例如,请考虑以下pubNameprivName属性。

// MYObject.h -- Public Interface
@interface MYObject : NSObject
@property (nonatomic, readwrite, retain) NSString *pubName;
@end

// MYObject.m

@interface MYObject () // Private Interface
@property (nonatomic, readwrite, retain) NSString *privName;
@end

@implementation MYObject
@synthesize pubName=pubName_;
@synthesize privName=privName_;

- (void)dealloc {
  [pubName_ release];
  [privName_ release];
}

然后,您应该始终对所有属性使用访问器,无论它们是公共还是私有(init和dealloc除外)。持续这样做是防止内存管理错误的最佳方法(导致泄漏和崩溃)。

答案 3 :(得分:0)

label = [UILabel alloc] initWithFrame:frame];
[self.view addSubview:label];

这可能是正确但危险的。如果标签的先前值为零,那就没问题了。如果label之前有一个不同的值,那么这就是内存泄漏,因为你没有释放先前由label指向的对象,但之后该对象只有一个引用,可能没有引用。

属性对于类似的东西很有用,即使它们没有被其他类使用。但是它们不是必需的。