Objective C:.h文件中没有成员变量的属性?

时间:2011-12-14 14:30:53

标签: objective-c

  

可能重复:
  Property Declaration and Automatic Backing Storage Allocation

为什么编译器会接受类似的东西而不是给出错误?

#import <UIKit/UIKit.h>
@interface fubar : NSOjbect {
}
@property (nonatomic, retain) NSArray *array;
@end

线索赞赏。

另外,编辑评论......这是否会降低代码的可读性?

3 个答案:

答案 0 :(得分:3)

编译器可以自动为您生成ivar。

在实现文件中,您应该找到类似这样的内容:

@synthesize array;

@synthesize array = _array;

我更喜欢第二种情况,因为ivar名称与属性名称不同,所以你被迫使用

self.array = anArray;

这样的事情无法编译:

array = anArray;

因为ivar名称是_array。

如果你问它是否不太可读 - 对我来说不是。我更喜欢自动生成ivars。

比较

#import <UIKit/UIKit.h>
@interface fubar : NSOjbect

@property (nonatomic, retain) NSArray *array;

@end

(我删除了花括号,因为在这种情况下它们不是必需的),用这个:

#import <UIKit/UIKit.h>
@interface fubar : NSOjbect {
    NSArray *array
}

@property (nonatomic, retain) NSArray *array;

@end

对我来说,代码越少越好(更容易理解)。

答案 1 :(得分:1)

虽然工作正常,@synthesize创建了ivar,但副作用是ivar在调试器中不可见。希望Apple能解决这个恼人的问题。

答案 2 :(得分:0)

属性不是实例变量就是简单的答案。

属性是一对setter / getter方法,如果他们愿意,可以设置/获取实例变量,但不必如此。

如果综合属性(即编译器自动创建setter和getter)并且实例变量不存在,编译器也会创建它。