@interface
和@implementation
TODO:分類(category)和擴展(extension)html
@property
、@synthesize
和@dynamic
segmentfault
objc推薦咱們經過set/get方法訪問對象的屬性。很顯然,爲每個屬性手動添加set/get方法的聲明和實現是個性價比很低的重複勞動。所以,objc提供了一些關鍵字幫助咱們簡化這一過程。這幾個關鍵字實際上就是這麼回事兒。bash
單獨作了總結:Objective-C的@property、@synthesize和@dynamic架構
@class
告訴編譯器有這麼個類在,屬性、方法什麼的暫時不用管。
主要的好處有兩點:app
減小重複編譯耗時框架
解決循環引用ide
在相關討論中能夠看到一些建議:佈局
但就我我的見到的代碼而言,@class並非普遍使用的特性。比起大量使用@class,我更傾向於只在有必要時才使用它。post
@public:實例變量可以使用符號 person->age = 32"
被直接讀取。
@package:實例變量是公開的,除非它被指定在框架外(僅適用 64 位架構)
@protected:實例變量僅可由其類和其衍生類訪問
@private:實例變量僅可由其類訪問性能
極少顯式地使用,用起來是這個樣子:
@interface Person : NSObject {
@public
NSString name;
int age;
@private
int salary;
}
複製代碼
默認地,@interface裏定義的實例變量是@protected的,子類可訪問。
須要私有變量時比較常見的方式是經過類擴展定義:
@interface HelloViewController ()
{
int _value;
}
複製代碼
也能夠在@implentation部分定義:
@implementation HelloViewController
{
int _value;
}
複製代碼
@protocol
協議,也就是在OO中談論的接口。
在協議中咱們可使用@required 和 @optional來指定方法是否必須實現,默認是required。
@protocol CustomControlDelegate
- (void)control:(CustomControl *)control didSucceedWithResult:(id)result;
@optional
- (void)control:(CustomControl *)control didFailWithError:(NSError *)error;
@end
複製代碼
@optionnal這個特性使得代碼更加靈活,挺多別的語言並不支持相似的能力,算是OC的一個優勢了。
try/catch/finally
,不贅述。
@try{
// 試圖執行下列語句
[self getValue:&value error:&error];
// 若是有異常或者被顯式拋出...
if (error) {
@throw exception;
}
} @catch(NSException *e) {
// …在這裏處理異常
} @finally {
// 老是在@try或@catch block的尾部執行這個
[self cleanup];
}
複製代碼
有個很大的項目爲了減小安裝包大小,曾經把oc exception的能力給關掉了。 = =,不要學他們。
@「aaa」
@100
@YES
@[@"a",@"b",@"c"]
@{
@"key":@"value"
}
複製代碼
@encode():返回一個類型的類型編碼。這個類型值能夠用於 NSCoder -encodeValueOfObjCType:at 中的第一個參數編碼。
char *enc1 = @encode(int); // enc1 = "i"
char *enc2 = @encode(id); // enc2 = "@"
char *enc3 = @encode(@selector(aMethod)); // enc3 = ":"
複製代碼
@defs():返回一個 Objective-C 類的佈局。已廢棄。
@autoreleasepool
@synchronized()
性能比較差可是用起來最方便的鎖。
@compatibility_alias能夠給類設置一個別名。
如
@compatibility_alias UICollectionViewController PSTCollectionViewController;
複製代碼
typedef NS_ENUM(NSUInteger, TTGState) {
TTGStateOK = 0,
TTGStateError,
TTGStateUnknow
};
複製代碼
參考
Enum in OC
總結:前三個數值上是相等的,在objc中用nil比較廣泛
常見的就是bool和BOOL。
bool是c語言的,單獨的一個類型(_Bool),在數值上true = 1,false = 0
bool類型只有true和false兩種狀態。
另外,條件判斷語句在判斷時,是以0爲false,非0爲true進行判斷的。
由此有如下結論:
2 == true //假
(bool)2 == true //真
2 //真
複製代碼
BOOL是ObjC定義的真假值類型,它在64位機器上等價於bool,在32位機器上是signed char
其定義以下,參考objc4-750
/// Type to represent a boolean value.
#if defined(__OBJC_BOOL_IS_BOOL)
// Honor __OBJC_BOOL_IS_BOOL when available.
# if __OBJC_BOOL_IS_BOOL
# define OBJC_BOOL_IS_BOOL 1
# else
# define OBJC_BOOL_IS_BOOL 0
# endif
#else
// __OBJC_BOOL_IS_BOOL not set.
# if TARGET_OS_OSX || TARGET_OS_IOSMAC || (TARGET_OS_IOS && !__LP64__ && !__ARM_ARCH_7K)
# define OBJC_BOOL_IS_BOOL 0
# else
# define OBJC_BOOL_IS_BOOL 1
# endif
#endif
#if OBJC_BOOL_IS_BOOL
typedef bool BOOL;
#else
# define OBJC_BOOL_IS_CHAR 1
typedef signed char BOOL;
// BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C"
// even if -funsigned-char is used.
#endif
複製代碼
YES和NO
bool的表現已經講過,這裏關注一下BOOL做爲signed char的表現。
這時,一個BOOL類型的變量值範圍是-128~127,所以強制類型轉換時可能會有異常:
BOOL boolVar = 256;
boolVar //假
boolVar == 0 //真
複製代碼
另外強制類型轉換時也不會把值轉爲0和1:
(BOOL)2 == true //假
複製代碼
綜上,使用時需注意:
if(var == YES)
應當直接寫成if(var)
。參考:
單獨開一篇,見iOS知識梳理 - category和extension
TODO:後面總結梳理。