聲明的屬性是否需要相應的實例變量?Objective-C 2.0中的屬性是否需要聲明相應的實例變量?例如,我習慣做這樣的事情:MyObject.h@interface MyObject : NSObject {NSString *name;}@property (nonatomic, retain) NSString *name;@endMyObject.m@implementation@synthesize name;@end但是,如果我這樣做了:MyObject.h@interface MyObject : NSObject {}@property (nonatomic, retain) NSString *name;@end這仍然有效嗎?它與我之前的例子有什么不同嗎?
3 回答

千巷貓影
TA貢獻1829條經驗 獲得超7個贊
如果您使用的是現代的Objective-C運行時(這是無論是iOS版3.x或更高,或64位雪豹或更高),那么你就不會需要在這樣的情況下,以高德定義為您的屬性。
當你@synthesize
的財產,伊娃實際上也將為你合成。這繞過了“脆弱的伊娃”情景。你可以在Cocoa with Love上閱讀更多相關信息

烙印99
TA貢獻1829條經驗 獲得超13個贊
如果您使用的是XCode 4.4或更高版本,它將為您生成實例變量合成代碼。
你只需聲明如下屬性; 它將為您生成合成代碼和實例變量聲明代碼。
@property (nonatomic, strong) NSString *name;
它會生成合成代碼
@synthesize name = _name;
并且您可以使用_name訪問實例變量,它類似于聲明
NSString* _name
但如果你聲明只讀屬性
@property (nonatomic, strong, readonly) NSString *name;
它會生成代碼
@synthesize name;
要么
@synthesize name = name;
因此,您應該使用前綴“_”訪問即時變量名稱,無論您編寫自己的合成代碼,編譯器都會為您生成代碼。你可以寫
@synthesize name = _name;
- 3 回答
- 0 關注
- 587 瀏覽
添加回答
舉報
0/150
提交
取消