iphone york 在Objective C中使用下劃線前綴屬性名稱




swift coding style (6)

我總是使用下劃線。 它在局部變量和實例變量之間創建了明確的區別。 在以下情況下,它還可以避免編譯器警告:

@interface MyClass
{
    NSString *name
}

@property (nonatomic, copy) NSString *name;

- (id) initWithName:(NSString *) name;
@end

@implementation MyClass

@synthesize name;

// The following method will result in a compiler warning
// (parameter name same as ivar name)
- (id) initWithName:(NSString *) name {
   if (self = [super init]) {
      self.name = name;
   }

   return self;
}

@end

編輯

在不得不忍受downvotes並閱讀評論之後,讓我試著指出我的觀點:

Apple建議ivars與其屬性具有相同的名稱。 Apple還建議屬性以小寫字母開頭。 Apple還建議局部變量以小寫字母開頭。

現在你有一個問題,因為當你讀取一段代碼,並且你看到一個正在使用的變量時,你不能通過命名約定告訴這個變量是一個ivar還是一個局部變量。 太糟糕了。 解決方案是對ivars和局部變量使用不同的命名約定。 這只是普通的常識。

實現此命名約定的方式無關緊要。 如果你真的想要,你可以簡單地將“_WOOHAHA”附加到ivar名稱。 我不在乎(但也許其他人會)。 問題在於,知道他們正在做什麼的人決定使用ivars的“下劃線前綴”。 恕我直言,他們做出了正確的決定,即使他們自己的公司推薦別的東西。 (我正在談論的開發人員是編寫一些主要的Apple框架和.NET Framework類的人)

最後,代碼質量比遵循一個愚蠢的規則更重要,而這個規則甚至沒有人們傳播它。

關於你所展示代碼的另一個評論:永遠不要在字符串屬性上使用retain 。 你應該使用副本

有關複製/保留屬性的更多信息,請參閱:

NSString屬性:複製還是保留?

我以前在變量名稱中避免使用下劃線,這可能是我大學Java時代的延續。 所以當我在Objective C中定義一個屬性時,這就是我自然而然的事情。

// In the header
@interface Whatever
{
    NSString *myStringProperty
}

@property (nonatomic, copy) NSString *myStringProperty;

// In the implementation
@synthesize myStringProperty;

但在幾乎所有的例子中都是如此

// In the header
@interface Whatever
{
    NSString *_myStringProperty
}

@property (nonatomic, copy) NSString *myStringProperty;

// In the implementation
@synthesize myStringProperty = _myStringProperty;

我應該克服對下劃線的厭惡,因為這是應該做的一種方式,這種風格是否是一個很好的理由?

更新:現在使用自動屬性合成,您可以省略@synthesize,結果與您使用的相同

@synthesize myStringProperty = _myStringProperty;

這清楚地表明了Apple的偏好。 我已經學會了停止擔心並喜歡下劃線。


現在,在2012-02-16修訂版之後,Apple在“可可編碼指南”中明確說明了以_為前綴的實例變量的命名約定。

確保實例變量的名稱簡明地描述了存儲的屬性。 通常,您不應該直接訪問實例變量,而應該使用訪問器方法(您可以直接在init和dealloc方法中訪問實例變量)。 為了幫助發出此信號,請使用下劃線(_)作為實例變量名稱的前綴,例如:

@implementation MyClass {
    BOOL _showsTitle;
}

如果使用聲明的屬性合成實例變量,請在@synthesize語句中指定實例變量的名稱。

@implementation MyClass
@synthesize showsTitle=_showsTitle;

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingIvarsAndTypes.html#//apple_ref/doc/uid/20001284-BAJGIIJE

2011年秋季由斯坦福大學Paul Hegarty教授的iTunes U,iPhone App Development CS193p講座也解釋了這一慣例。

http://itunes.apple.com/itunes-u/ipad-iphone-application-development/id473757255

我知道很久以前就提出過這個問題了,但我自己也有同樣的問題想分享我的發現。


這純粹是一種風格問題。

我不知道哪些例子使用了強調的ivar風格。 官方的Apple示例(例如CryptoExercise )不會在ivars前加上_


目前建議的Objective-C 2.0實踐是使用與ivar相同的名稱作為屬性。 您可以選擇在@property聲明中指定不同的ivar,但默認情況下,屬性的合成訪問器將訪問與該屬性同名的ivar,這表明它們是您希望遵循的模式。

無論如何,由於對象仍然必須向自己發送消息以訪問屬性,因此當您訪問屬性或直接訪問其支持ivar時很難混淆,儘管使用2.0點訪問屬性確實可以實現更有可能。 使用標準消息傳遞語法使意圖更明確,IMO。

@interface Foo : NSObject {
     NSNumber *bar;
} 
@property(readwrite, retain) NSNumber * bar
@end

@implementation Foo 
@synthesize bar;

-(void) baz {
   NSNumber *numberOne = [NSNumber numberWithInt: 1];   
   //Both set the value of bar through either the your custom or the synthesized setter method
   [self setBar:numberOne];  
   self.bar = numberOne; 

   //Both get the value of bar through your synthesized or your custom accessor method
   NSNumber *fooBar = [self bar];
   fooBar = self.bar;

   //Both manipulate the bar ivar directly
   bar = numberOne;
   fooBar = bar;
}
@end 

我只想指出,使用核心數據的新導航項目默認使用尾隨下劃線,並使變量變為私有。

@interface MyTestAppDelegate : NSObject <UIApplicationDelegate> {

    UIWindow *window;
    UINavigationController *navigationController;

@private
    NSManagedObjectContext *managedObjectContext_;
    NSManagedObjectModel *managedObjectModel_;
    NSPersistentStoreCoordinator *persistentStoreCoordinator_;
}

@interface RootViewController : UITableViewController <NSFetchedResultsControllerDelegate> {

@private
    NSFetchedResultsController *fetchedResultsController_;
    NSManagedObjectContext *managedObjectContext_;
}

Apple保留選擇器以下劃線開頭,用於他們自己的“私人”方法,其中包括屬性。 我不認為他們會為伊娃的名字保留_。

就個人而言,我會避免使用下劃線來啟動任何類型的變量名稱。 這是一個不透明的慣例。 如果其他人對本地人使用下劃線而對實例變量沒有下劃線怎麼辦? 如果您在使用同名本地定義的方法中意外省略了下劃線,該怎麼辦?

使您的本地名稱與您的ivar名稱不同更好。 例如,在setter中,您可以使用newName或neWValue。





coding-style