当setter和getter是自定义的时,@ property会隐藏_ivar

时间:2016-02-11 12:17:35

标签: objective-c

#import "AppDelegate.h"

@interface AppDelegate ()

@property (strong, readwrite, nonatomic) NSNumber *currentNumber;

@end

@implementation AppDelegate


- (NSNumber *)currentNumber {



}

- (void)setCurrentNumber:(NSNumber *)currentNumber {

}
  1. 为什么我无法访问currentNumber中的_currentNumber?
  2. 如果我要删除setCurrentNumber,那么我可以访问currentNumber中的_currentNumber吗?

2 个答案:

答案 0 :(得分:2)

@property不会导致ivar生成;相反,它是隐含的@synthesize。但是,当你同时实现getter和setter时,没有什么可以(隐式地)合成,所以clang不会打扰。如果您添加明确的@synthesize语句,则会获得您的ivar。

答案 1 :(得分:1)

与提及的 Avi 一样,有@synthesize个关键字。如果你只声明属性(没有为它实现getter和setter),将生成相应的ivar。它的名称将是[下划线] [property_name]。例如,声明@property currentNumber;会导致隐式应用`@synthesize currentNumber = _currentNumber; 但是如果你想为你的财产分配另一个名称的ivar,你可以声明这个ivar并用它合成该属性:

@interface AppDelegate ()
{
     NSNumber *_anotherIvar;
}
@property (strong, readwrite, nonatomic) NSNumber *currentNumber;

@end

@implementation AppDelegate
@synthesize currentNumber = _anotherIvar;
@end

@synthesize告诉编译器创建相应的getter和setter,它们在赋值的右侧由ivar支持。如果你提供自己的setter - 你阻止编译器创建隐式合成(并生成ivar),所以你需要自己提供ivar(例如使用显式合成)。

Here是关于@synthesize的好解释。