具有或不具有实例变量的Objective-C属性

时间:2011-08-22 22:04:38

标签: objective-c ios class properties

  

可能重复:
  Properties and Instance Variables in Objective-C 2.0

我正在使用属性仅用于获取或设置我正在创作的类的值时不需要任何实际验证的ivars。

Ex: 
@interface ClassB : NSObject
{
    // No ivars
}

@property (nonatomic, retain) ClassA *obj;
@property (nonatomic, retain) NSString *str;

每当我在课堂上调用这些方法时,我总是使用self.obj / self.str或[self obj] / [self str]。这样,为了设置对象的状态,您必须通过该属性,以便编译器生成的getter和setter更仔细地管理引用。话虽如此,我是否有任何问题可以用这种方式创建我的课程?另外,如果没有ivar,@ implementation文件中覆盖的“dealloc”方法是否需要“release”?

3 个答案:

答案 0 :(得分:3)

如果您正在使用@synthesize指令来创建属性访问器,则编译器还将创建您从类声明中省略的任何ivars。你仍然需要释放你的ivars。以前你不能直接访问合成的ivars,所以必须在-dealloc方法中使用属性setter,如下所示:

- (void)dealloc
{
    self.obj = nil;
    self.str = nil;
    [super dealloc];
}

但是,这些天,编译器会让你直接访问合成的ivar,所以你可以释放它而不是调用setter(这在-dealloc中是个好主意,在其他地方也是个坏主意):

- (void)dealloc
{
    [obj release];
    [str release];
    [super dealloc];
}

当您最终将代码转换为ARC(自动引用计数)时,这将发生变化,因为编译器将负责为您释放-dealloc中的ivars。大多数情况下,这意味着您的-dealloc实现可能会消失。

答案 1 :(得分:2)

没有必要明确声明您的IVars。我甚至建议省略它们,因为你应该总是通过访问器访问IVars(当你指出你已经做过的事情时。)

你不会遇到任何问题,除了调试器不再直接捕获IVars(它们不会很好地显示在你的控制台旁边。) - 但这不是一个真正的问题。

在你的dealloc方法中,你不再需要释放它们了。你需要做的就是取消他们。

self.obj = nil;

-

以下是属性属性实际含义的简要概述: (那是为了向你展示当你在dealloc中找到一个变量时会发生一个释放)

指定

@property(assign)NSString * name;

name = newValue;

<强>保留

@property(retain)NSString * name;

if (name != newValue) {
   [name release];
   name = [newValue retain];
}

复制

@property(copy)NSString * name;

if (name != newValue) {
   [name release];
   name = [newValue copy];
}

答案 2 :(得分:0)

编译器会自动为您创建ivar,即使它没有在ivar列表中明确定义。它的名称与属性列表中的名称相同。编译器现在只需要重复的定义行。

如果您有需要释放的属性(ivars),请执行此操作。