【问题标题】:Why in ObjectiveC there is a "_" before parameter? [duplicate]为什么在ObjectiveC中参数前有一个“_”? [复制]
【发布时间】:2014-06-01 09:37:44
【问题描述】:

我是 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前加上“_”?

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

提前致谢。

【问题讨论】:

  • 这也是很多其他编程语言中非常常用的风格
  • @BryanChen - 只是说这已被标记为重复,但您链接到的答案是 2009 年提出的问题,并且接受的答案与更新后的编译器/目标语法不匹配C

标签: ios objective-c


【解决方案1】:

来自Apple Docs

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

实例变量是一个存在并在对象生命周期内保持其值的变量。用于实例变量的内存在对象首次创建时分配(通过 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];
}

此规则的例外是在编写初始化、解除分配或自定义访问器方法时,如本节后面所述。

【讨论】:

  • 你说the synthesized instance variable has the same name as the property, but with an underscore prefix。为什么_someStringmyString的名字不一样?
  • 它们只是如何设置 someString 属性/实例变量的示例 - 此信息直接来自 Apple 文档
【解决方案2】:

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

@property (strong) NSString *testString;

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

【讨论】:

    【解决方案3】:

    当你声明属性@property (strong, nonatomic) CBPeripheralManager *peripheralManager;时,编译器会自动生成实例变量_peripheralManager

    你可以手动声明,结果是一样的:

    @synthesize peripheralManager = _peripheralManager;
    

    【讨论】:

      猜你喜欢
      • 2013-04-18
      • 2014-12-06
      • 1970-01-01
      • 2023-03-23
      • 2010-11-13
      • 2011-03-05
      • 1970-01-01
      • 2018-11-28
      • 1970-01-01
      相关资源
      最近更新 更多