参见英文答案 How does an underscore in front of a variable in a cocoa objective-c class work?9个 我是iOS开发的新手,并为IOS研究蓝牙低功耗(BLE,蓝牙4.0). 我看到了一些示例代码,如下所示: @property (strong
我是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]; }
此规则的例外是在编写初始化,释放或自定义访问器方法时,如本节后面所述.