iOS知識梳理 - Objc語法中值得注意的東西

@關鍵字

1. 類的聲明和實現

@interface@implementation
TODO:分類(category)和擴展(extension)html

2. 屬性相關

@property@synthesize@dynamicsegmentfault

objc推薦咱們經過set/get方法訪問對象的屬性。很顯然,爲每個屬性手動添加set/get方法的聲明和實現是個性價比很低的重複勞動。所以,objc提供了一些關鍵字幫助咱們簡化這一過程。這幾個關鍵字實際上就是這麼回事兒。bash

單獨作了總結:Objective-C的@property、@synthesize和@dynamic架構

3. 前向聲明

@class告訴編譯器有這麼個類在,屬性、方法什麼的暫時不用管。
主要的好處有兩點:app

  1. 減小重複編譯耗時框架

    • 當一個頭文件發生變化,全部import它的文件都須要從新編譯,有些實際上是沒必要要的。
  2. 解決循環引用ide

相關討論中能夠看到一些建議:佈局

  1. 在.h文件中儘可能多地用@class
  2. 在.m文件中所有用import

但就我我的見到的代碼而言,@class並非普遍使用的特性。比起大量使用@class,我更傾向於只在有必要時才使用它。post

4. 實例變量可見性

@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;
}
複製代碼

5. 協議

@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的一個優勢了。

6. 異常處理

try/catch/finally,不贅述。

@try{
  // 試圖執行下列語句
  [self getValue:&value error:&error];

  // 若是有異常或者被顯式拋出...
  if (error) {
    @throw exception;
  }
} @catch(NSException *e) {
  // …在這裏處理異常
}  @finally {
  // 老是在@try或@catch block的尾部執行這個
  [self cleanup];
}
複製代碼

有個很大的項目爲了減小安裝包大小,曾經把oc exception的能力給關掉了。 = =,不要學他們。

7. 對象字面量

@「aaa」
@100
@YES
@[@"a",@"b",@"c"]
@{
    @"key":@"value"
}
複製代碼

8. OC字面量

  • @selector():返回一個指向有特定名稱的選擇器的 SEL 指針。用於相似 -performSelector:withObject: 的方法。
  • @protocol():返回一個指向有特定名稱的協議的 Protocol * 指針。用於相似 -conformsToProtocol: 的方法。

9. C字面量

@encode():返回一個類型的類型編碼。這個類型值能夠用於 NSCoder -encodeValueOfObjCType:at 中的第一個參數編碼。

char *enc1 = @encode(int);                 // enc1 = "i"
char *enc2 = @encode(id);                  // enc2 = "@"
char *enc3 = @encode(@selector(aMethod));  // enc3 = ":"
複製代碼

@defs():返回一個 Objective-C 類的佈局。已廢棄。

10. 內存管理

@autoreleasepool

11. 鎖

@synchronized()
性能比較差可是用起來最方便的鎖。

12. 別名

@compatibility_alias能夠給類設置一個別名。

@compatibility_alias UICollectionViewController PSTCollectionViewController;
複製代碼

enum

typedef NS_ENUM(NSUInteger, TTGState) {
    TTGStateOK = 0,
    TTGStateError,
    TTGStateUnknow
};
複製代碼

參考

Enum in OC

空指針

  • NULL:C的空指針 (void *)0
  • nil:objc的空對象 (id)0
  • Nil:空的類指針 (Class)0
  • NSNull:nil的包裝類,爲了表示dic裏面的某個value爲空 [NSNull null]

總結:前三個數值上是相等的,在objc中用nil比較廣泛

參考nil / Nil / NULL / NSNull

BOOL

常見的就是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 //假
複製代碼

綜上,使用時需注意:

  1. 使用條件表達式時不須要跟YES、NO進行比較,如if(var == YES)應當直接寫成if(var)
  2. 不要把其它類型強制轉換成BOOL

參考:

  1. ObjC的BOOL爲何要用YES、NO而不建議用true、false?
  2. BOOL / bool / Boolean / NSCFBoolean

category和extension

單獨開一篇,見iOS知識梳理 - category和extension

內存管理

TODO:後面總結梳理。

相關文章
相關標籤/搜索