這真的真的很有幫助,但大多數人不知道爲什麼,這是一個恥辱。 Apple使用下劃線來分隔其他對象訪問特定對象變量的方式,以及特定對象訪問其自身變量的方式。 現在,這聽起來有點怪怪的,但想象一下以下內容:你可能都承認以下編譯器警告
.h
@property (nonatomic, retain, readonly) UITableView *tableView;
.m
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return [self loadSomethingElseForTableView:tableView];
}
這將導致一個編譯器警告,因爲它不知道無論您參考局部變量「tableView」或實例變量。 因此,Apple建議您將以下內容添加到@implementation的頂部。
@synthesize tableView = _tableView;
現在,當您參考_tableView
,編譯器知道你指的是實例變量,而不是本地的。
此外,這使得它更容易理解Obj-C中的垃圾收集,並防止發生常見錯誤。
例如,在做的時候以下幾點:
@property (nonatomic, retain, readonly) NSString *title;
- (id)initWithTitle:(NSString *)title {
if ((self = [super init])) {
self.title = title; // Is not possible, since it's read only.
title = title; // Is not possible, since it's the same (local) variable.
// Changing the method to initWithTitle:(NSString *)aTitle;
title = aTitle;
}
return self;
}
現在,既然你不使用默認的setter方法(實際上,你不能,因爲它是隻讀)你需要保留改變你自己。 當你給每個實例變量一個前綴時(這樣你就知道你需要自己保留它),這是很容易記住的。
所以,基本上,瞭解self.variable
和(_
)variable
之間的區別很重要。 (即:self.variable
映射到[self setVariable:...]
和variable
直接映射到你的指針
此外,當你將它添加爲私有變量,像這樣:
@interface TSSomeObject : NSObject {
@private
NSString *_privateTitle;
}
@end
下劃線前綴是不是真的有必要,除非你可能遇到同名的局部變量,除此之外,它也是一種簡單的方法來提醒你,它是一個本地指針,當你將它指定給對象時,你需要保留(並釋放)變量。
什麼是錯誤是創建一個屬性有下劃線前綴,像這樣:
@property (nonatomic, retain) NSString *_title;
這是真的錯了,我也不打算解釋爲什麼;)
所以,是的!你應該真的使用下劃線前綴,它使你的代碼更容易閱讀,並由編譯器解釋!在Xcode 4中,Apple甚至將這些@synthesize
添加到默認模板中。
或靜態在C中。 – 2010-04-18 00:37:25