为什么在ObjectiveC中参数之前有一个“_”?

时间:2014-04-17 07:57:58

标签: ios objective-c

我是iOS开发的新手,并为IOS研究 Bluetooth Low Energy (BLE, Bluetooth 4.0)

我看到了一些示例代码,如下所示:

@property (strong, nonatomic) CBPeripheralManager *peripheralManager;

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Start up the CBPeripheralManager
    _peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:nil];
}

The question is :

为什么要添加" _"在ViewDidload中的peripheralManager之前?

对不起我的英语和任何愚蠢......

提前致谢。

3 个答案:

答案 0 :(得分:7)

来自Apple Docs

大多数属性都由实例变量支持 默认情况下,readwrite属性将由实例变量支持,该实例变量将再次由编译器自动合成。

实例变量是一个存在的变量,它保存对象生命周期的值。用于实例变量的内存在首次创建对象时(通过alloc)分配,并在释放对象时释放。

除非另行指定,否则合成的实例变量与属性具有相同的名称,但带有下划线前缀。例如,对于名为firstName的属性,合成的实例变量将被称为_firstName。

虽然对象使用访问器方法或点语法访问自己的属性是最佳做法,但可以直接从类实现中的任何实例方法访问实例变量。下划线前缀清楚地表明您正在访问实例变量,而不是例如本地变量:

- (void)someMethod {
    NSString *myString = @"An interesting string";

    _someString = myString;
}

在这个例子中,很明显myString是一个局部变量,而_someString是一个实例变量。

通常,即使您从自己的实现中访问对象的属性,也应该使用访问器方法或点语法进行属性访问,在这种情况下,您应该使用self:

- (void)someMethod {
    NSString *myString = @"An interesting string";

    self.someString = myString;
  // or
    [self setSomeString:myString];
}

此规则的例外情况是编写初始化,释放或自定义访问器方法时,如本节后面所述。

答案 1 :(得分:0)

它的类成员变量的内部访问约定。

@property(strong)NSString * testString;

它可以在类,self.testString或_testString中访问。但这是不同的意义。 self.testString表示通过自动创建的成员函数进行访问。但是_testString意味着直接访问变量。

答案 2 :(得分:0)

当您声明属性_peripheralManager

时,编译器会自动生成实例变量@property (strong, nonatomic) CBPeripheralManager *peripheralManager;

您可以手动声明,结果将是相同的:

@synthesize peripheralManager = _peripheralManager;