当前位置 : 主页 > 手机开发 > ios >

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

来源:互联网 收集:自由互联 发布时间:2021-06-11
参见英文答案 How does an underscore in front of a variable in a cocoa objective-c class work?9个 我是iOS开发的新手,并为IOS研究蓝牙低功耗(BLE,蓝牙4.0). 我看到了一些示例代码,如下所示: @property (strong
参见英文答案 > How does an underscore in front of a variable in a cocoa objective-c class work?                                    9个
我是iOS开发的新手,并为IOS研究蓝牙低功耗(BLE,蓝牙4.0).

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

@property (strong, nonatomic) CBPeripheralManager *peripheralManager;

- (void)viewDidLoad
{
    [super viewDidLoad];

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

问题是 :

为什么在ViewDidload中在peripheralManager之前添加“_”?

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

提前致谢.

从 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];
}

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

网友评论