在Xcode 4.4之前的大多數項目中,我意識到開發者同時聲明瞭一個ivar和一個同名的屬性。示例爲什麼需要申報伊爾和同名的財產?
@interface SecondViewController : UIViewController
{
NSString *string;
}
@property (strong, retain) NSString *string;
所以我不知道爲什麼?
在Xcode 4.4之前的大多數項目中,我意識到開發者同時聲明瞭一個ivar和一個同名的屬性。示例爲什麼需要申報伊爾和同名的財產?
@interface SecondViewController : UIViewController
{
NSString *string;
}
@property (strong, retain) NSString *string;
所以我不知道爲什麼?
我不能說別人,但我不使用同一個名字。如果我確實聲明瞭一個實例變量,則它帶有一個前導下劃線,所以很明顯,如果我指的是實例變量或setter/getter方法。
使用Xcode 4.4+,您不需要聲明實例變量或調用@synthesize
,編譯器將自動創建一個具有前導下劃線的實例變量,併爲您提供setter/getter方法。
但是,我不認爲這種機制是一個非常好的主意,因爲它鼓勵開發人員暴露不應該暴露的類的屬性。
例如,這是從開始的iOS 6開發採取:
@interface BIDViewController : UIViewController
@property (weak, nonatomic) IBOutlet UIButton *button;
- (IBAction)buttonPressed:(UIButton *)sender;
@end
現在,雖然我知道你不希望一次混淆了太多的概念一個初學者,你立刻擁有通過將UIButton
對象和操作方法暴露給此視圖控制器的用戶來違反面向對象的封裝,並且都不應該公開。
會發生什麼情況,例如,如果使用類做這樣的:
BIDViewController *vc = ...;
vc.button = nil;
或
vc.buttonPressed(mySegmentedControl);
地獄破散。現在,雖然有1000種方法可以打破一個程序,但我們無法抵禦所有這些方法,但我們不想制定一個已經很弱的系統(Objective-C在定義誰可以和不可以調用一個你的方法)較弱。
以上實現方案是採用私有的實例變量和方法做得更好,這兩者都是由Interface Builder榮幸:
@implementation BIDViewController()
{
IBOutlet UIButton *_button;
}
- (IBAction)_buttonPressed:(UIButton *)sender;
@end
任何使用類將打破這種模式的一個艱難的時期。
但是這當然是更多的思考和打字開發人員,所以蘋果已經推出了新功能,以便他們能夠在更短的時間內完成他們想要完成的任務(當您只需將插座拖到頭文件,併爲您提供聲明和實現框架)。
只是一個風格問題,習慣於從過去的編譯器的行爲。
現在在新的編譯器中,這不是必需的。只要你創建一個屬性,在場景後面創建一個ivar,並將其合成。
編譯器使用_propertyName的別名進行合成,即使您可以選擇更改此默認行爲。
@interface AppDelegate : NSObject <NSApplicationDelegate>{
NSString *bigString;
}
@property(strong)NSString *smallString;
@end
@implementation AppDelegate
@synthesize smallString=bigString;
-(void)awakeFromNib{
[email protected]"hello";
NSLog(@"%@",self.smallString);
}
@end
這是正確答案,+1。這不是Xcode版本的問題,它是語言方言版本的問題,它是在某個版本的編譯器中實現的。 – 2013-03-02 09:30:56
@ H2CO3:謝謝,每當你給我+1,我覺得好:) – 2013-03-02 09:35:41
這條線的意義'@synthesize smallString = bigString;' – Proton 2013-03-02 09:50:03
DUP:http://stackoverflow.com/questions/5555736/objective-c-why-do-we-declare-ivars-in-the-h-member-area- if-property-looks- – justin 2013-03-02 10:43:18