成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

了解Cocoa和Objective-C一些特性

移動開發 iOS
本文介紹的是了解Cocoa和Objective-C一些特性,主要介紹了Cocoa和Objective-C相關的特性,來看本文詳解。

了解CocoaObjective-C一些特性是本文要介紹的內容,對于Objective-C的一些特性,初學者應該好好的參考一番,文中介紹的夜很詳細。不多說,我們來看內容。
 
1、成員變量應該定義為@private

參考代碼:

  1. @interface MyClass : NSObject {  
  2.  @private  
  3.   id myInstanceVariable_;  
  4. }  
  5. // public accessors, setter takes ownership  
  6. - (id)myInstanceVariable;  
  7. - (void)setMyInstanceVariable:(id)theVar;  
  8. @end 

2、明確指定初始化

注釋并說明指定的初始化。

明確指定初始化對想要子類化你的類的時候時很重要的。那樣,子類化時只需要做一個或多個初始化去保證初值即可。這也有助于在以后調試你的類時明了初始化流程。

3、重寫指定初始化

當重寫一個子類并需要init...方法,注意要重寫父類的指定初始化方法。

如果你沒有正確重寫父類的指定初始化方法,你的初始化方法可能不會被調用,這會導致很多微妙而難以排除的錯誤。

4、重寫NSObject的方法

強烈建議在@implementation之后就立即重寫NSObject 的方法。建議重寫 init...,copyWithZone:和 dealloc 方法。init...相關的方法寫在一起, 接下來是 copyWithZone: ,最后是 dealloc。

5、避免調用new方法

不要調用NSObject 的new方法,也不要在子類中重寫它,而是應該使用 alloc 和 init 方法來初始化retained的對象。

Objective-C代碼顯式調用 alloc 和 init 方法來創建和retain一個對象。new 的方法可能會帶來內存上調試的麻煩。

6、初始化變量

沒必要在初始化方法里把變量初始化為0或者nil,這是多余的。

所有新分配內存的對象內容都初始化為0(除了isa),所以不要在init方法里做無謂的重初始化為0的操作。

7、保持公有API簡明

保持你的類簡單,如果一個方法沒必要公開就不要公開。使用私有類別保證公開頭文件的簡潔。

和C++不同,Objective-C無法區分公有私有方法,因為它全是公有的。因此,除非就是為了讓用戶調用所設計,不要把其他的方法放到公有API里。這樣可以減少不期調用的可能性。這還包括重寫父類的方法。對于那些內部實現的方法,在實現文件里使用類別而不是將方法定義在公有頭文件里。

  1. // GTMFoo.m  
  2.  
  3. #import "GTMFoo.h"   
  4. @interface GTMFoo (PrivateDelegateHandling)  
  5. - (NSString *)doSomethingWithDelegate;  // Declare private method  
  6. @end  
  7. @implementation GTMFoo(PrivateDelegateHandling)  
  8. ...  
  9. - (NSString *)doSomethingWithDelegate {  
  10.   // Implement this method  
  11. }  
  12. ...  
  13. @end 

8、#import和#include

用#import導入Objective-C或Objective-C++頭文件,用#include導入C或C++頭文件

根據頭文件的語言去選擇合適的導入方式。

當導入的頭文件使用Objective-C或Objective-C++語言時,使用#import。

當導入標準C或C++頭文件時,使用#include。頭文件應該使用自己的#define重加載保護。

有些Objective-C頭文件沒有#define重加載保護,所以只應該用#import導入。因此Objective-C頭文件只應該被Objective-C源文件或其他的Objective-C頭文件所導入。這種情況下全部使用#import是合適的。

標準C和C++頭文件不包含任何Objective-C元素都可以被一般的C或C++文件導入。因為標準C和C++里根本沒有#import,所以也只能用#include導入。在Objective-C代碼中使用#include一致的導入這些頭文件。

本條款有助于跨平臺項目的無意錯誤。一位Mac開發者引入一份新C或C++頭文件時可能會忘記添加#define重加載保護,因為在Mac上用#import導入文件不會引發問題,但在別的使用#include的平臺就可能出問題。在所有平臺一致的使用#include意味著要么全部成功要么全部失敗,避免了那種一些平臺上可以運作而另一些不行的情況。

  1. #import <Cocoa/Cocoa.h> 
  2. #include <CoreFoundation/CoreFoundation.h> 
  3. #import "GTMFoo.h"  
  4. #include "base/basictypes.h" 

9、使用根框架

導入框架根的頭文件而不是分別導入框架頭文件

看起來從Cocoa或Foundation這些框架里導入個別的文件很不錯,但實際上你直接導入框架根頭文件效率更高。框架根已經被預編譯故可更快的被加載。還有,記住用#import指令而不是#include導入Objective-C的框架。

  1. #import <Foundation/Foundation.h>     // good  
  2. #import <Foundation/NSArray.h>        // avoid  
  3. #import <Foundation/NSString.h> 

10、構建時即設定autorelease

當創建新的臨時對象時,在同一行代碼里就設定autorelease而不是寫到這個方法的后面幾行去

即使這樣可能會造成一些輕微的延遲,但這樣避免了誰不小心把release去掉,或在release之前就return而造成的內存泄露,如下:

  1. // AVOID (unless you have a compelling performance reason)  
  2. MyController* controller = [[MyController alloc] init];  
  3. // ... code here that might return ...  
  4. [controller release];  
  5. // BETTER  
  6. MyController* controller = [[[MyController alloc] init] autorelease]; 

11、優先autorelease而非retain

對象賦值時盡量采用autorelease而不是retian模式。

當把一個新創建的對象賦予一個變量的時候,第一件要做的事情就是先釋放原來變量指向的對象以防止內存泄露。這里也有很多"正確的"方法去做這件事。我們選擇autorelease時因為它更不傾向于出錯。小心在密集的循環里可能會很快填滿autorelease池,而且它也確實會降低效率,但權衡下來還是可以接受的。

  1. - (void)setFoo:(GMFoo *)aFoo {  
  2.   [foo_ autorelease];  // Won't dealloc if |foo_| == |aFoo|  
  3.   foo_ = [aFoo retain];  

12、以聲明時的順序dealloc處理實例變量
dealloc應該用在@interface聲明時同樣的順序處理實例變量,這也有助于評審者鑒別。

代碼評審者檢查或修正dealloc的實現要確保所有retain的實例變量都獲得了釋放。

為了簡化評審dealloc,將釋放retain的實例變量代碼保持和@interface里聲明的順序一致。如果dealloc調用了其他方法去釋放實例變量,添加注釋說明那些實例變量被這些方法所處理了。

13、Setters copy NSStrings

在NSString上調用Setters方法時,永遠使用copy方式。永遠不要retain一個字符串,這可以防止調用者在你不知到的情況下修改了字符串。不要以為你可以改變NSString的值,只有NSMutableString才能做到。

  1. - (void)setFoo:(NSString *)aFoo {  
  2.   [foo_ autorelease];  
  3.   foo_ = [aFoo copy];  

#p#

14、避免拋出異常

不要@throwObjective-C的異常,不過你還是要做好準備捕獲第三方以及系統調用拋出的異常。

我們的確在編譯時加入了-fobjc-exceptions指令(主要是為了獲得@synchronized),但我們并不@throw。當然在使用第三方庫的時候是允許使用@try,@catch,以及@finally的。如果你確實使用了,請務必明確到文檔中哪個方向你想拋出什么異常。

除非你寫的代碼想要泡在MacOS10.2或更之前,否則不要使用NS_DURING,NS_HANDLER,NS_ENDHANDLER,NS_VALUERETURNandNS_VOIDRETURN這些宏。

另外你要小心當寫Objective-C++代碼的時候,如果拋出Objective-C異常,那些棧上的對象不會被清理。示例:

  1. class exceptiontest {  
  2.  public:  
  3.   exceptiontest() { NSLog(@"Created"); }  
  4.   ~exceptiontest() { NSLog(@"Destroyed"); }  
  5. };  
  6. void foo() {  
  7.   exceptiontest a;  
  8.   NSException *exception = [NSException exceptionWithName:@"foo"  
  9.                                                    reason:@"bar"  
  10.                                                  userInfo:nil];  
  11.   @throw exception;  
  12. }  
  13. int main(int argc, char *argv[]) {  
  14.   GMAutoreleasePool pool;  
  15.   @try {  
  16.     foo();  
  17.   }  
  18.   @catch(NSException *ex) {  
  19.     NSLog(@"exception raised");  
  20.   }  
  21.   return 0;  

將會有如下輸出:

  1. 2006-09-28 12:34:29.244 exceptiontest[23661] Created  
  2. 2006-09-28 12:34:29.244 exceptiontest[23661] exception raised 

注意這里的析構函數永遠沒有機會被調用。這是在你想用棧上的智能指針比如shared_ptr,linked_ptr,還有STL對象的時候不得不關注的一個核心問題。如果你一定要在Objective-C++代碼里拋出異常,那就請一定使用C++的異常。永遠不要重新拋出一個Objective-C的異常,也不允許在異常塊即@try,@catch,@finally里生成棧上的C++對象(比如std::string,std::vector等)。

15、nil檢查

僅在校驗邏輯流程時做nil檢查。

使用nil檢查不是為了防止程序崩潰,而是校驗邏輯流程。向一個空對象發送一條消息是由Objective-C運行時處理的。方法沒有返回結果,你也可以安心走下去。

注意這里和C/C++的空指針檢查是完全不同的,在那些環境里,并不處理空指針情況并可能導致你的應用程序崩潰。不過你仍要自己確保提領的指針不為空。

16、 BOOL類型陷阱

整形的轉換為BOOL型的時候要小心。不要直接和YES做比較。

BOOL在Objective-C里被定義為unsignedchar,這意味著它不僅僅只有YES(1)和NO(0)兩個值。不要直接把整形強制轉換為BOOL型。常見的錯誤發生在把數組大小,指針的值或者邏輯位運算的結果賦值到BOOL型中,而這樣就導致BOOL值的僅取決于之前整形值的最后一個字節,有可能出現整形值不為0但被轉為NO的情況。應此把整形轉為BOOL型的時候請使用ternery操作符,保證返回YES或NO值。

在BOOL,_BOOL以及bool(見C++Std4.7.4,4.12以及C99Std6.3.1.2)之間可以安全的交換值或轉型。但BOOL和Boolean之間不可,所以對待Boolean就像上面講的整形一樣就可以了。在Objective-C函數簽名里僅使用BOOL。

對BOOL值使用邏輯運算(&&,||,!)都是有效的,返回值也可以安全的轉為BOOL型而不需要ternery操作符。

  1. - (BOOL)isBold {  
  2.   return [self fontTraits] & NSFontBoldTrait;  
  3. }  
  4. - (BOOL)isValid {  
  5.   return [self stringValue];  
  6. }  
  7. - (BOOL)isBold {  
  8.   return ([self fontTraits] & NSFontBoldTrait) ? YES : NO;  
  9. }  
  10. - (BOOL)isValid {  
  11.   return [self stringValue] != nil;  
  12. }  
  13.  
  14. - (BOOL)isEnabled {  
  15.   return [self isValid] && [self isBold];  

還有,不要把BOOL型變量直接與YES比較。這樣不僅對于精通C的人很有難度,而且此條款的第一點也說明了這樣做未必能得到你想要的結果。

  1. BOOL great = [foo isGreat];  
  2. if (great == YES)  
  3.   // ...be great!  
  4. BOOL great = [foo isGreat];  
  5. if (great)  
  6. // ...be great! 

17、屬性

屬性遵循如下規則:屬性是Objective-C2.0的特性,所以只能跑在iPhone以及MacOSX10.5(leopard)或更高的版本。

一個有屬性關聯實例變量都要在后面加下劃線,而該屬性的名稱就是實例變量不加尾部的下劃線的名字。

使用@synthesize標識以正確的重命名屬性。

  1. @interface MyClass : NSObject {  
  2.  @private  
  3.   NSString *name_;  
  4. }  
  5. @property(copy, nonatomic) NSString *name;  
  6. @end  
  7. @implementation MyClass  
  8. @synthesize name = name_;  
  9. @end 

屬性的聲明必須緊接變量申明的括號后。屬性的定義應該緊接@implementation模塊后面。它和@interface 或者@implementation 的縮進是相同的。

  1. @interface MyClass : NSObject {  
  2.  @private  
  3.   NSString *name_;  
  4. }  
  5. @property(copy, nonatomic) NSString *name;  
  6. @end  
  7. @implementation MyClass  
  8. @synthesize name = name_;  
  9. - (id)init {  
  10. ...  
  11. }  
  12. @end 

18、為NSString使用Copy屬性

NSString的屬性定義為copy。

如果自己實現setters方法,也請使用copy而不是retain。

小結:了解CocoaObjective-C一些特性的內容介紹完了,希望本文對你有所幫助!

責任編輯:zhaolei 來源: 互聯網
相關推薦

2011-08-01 11:49:05

Objective-C

2011-05-11 15:19:01

CocoaObjective-C

2011-07-28 18:11:18

Objective-C Cocoa 編程

2012-01-18 10:13:50

Objective-CiOSself

2011-07-19 13:49:19

Objective-C 數據類型

2011-08-15 16:09:44

Cocoa對象Objective-C

2011-07-07 17:17:23

Objective-C

2014-11-25 10:18:17

Objective-C

2013-07-24 19:19:03

Objective-CiOS開發動態特性之protoc

2011-08-05 15:56:03

Objective-C 消息 函數

2011-08-01 11:37:41

iPhone Objective- 內存

2011-07-22 15:10:51

Objective-C 文件

2011-06-27 15:48:09

Cocoa TouchObjective-C

2011-07-26 10:50:50

Objective-C Selector

2015-11-02 10:13:41

iOSObjective-C語法

2011-08-02 15:55:31

Objective-C NSAutorele

2011-12-12 13:22:51

CocoaObjective-C

2013-05-02 10:51:17

iOS開發Objective-C@property

2011-07-26 09:19:27

Objective-C 重載

2015-07-08 10:47:57

Using Swift CocoaObjective-C
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕三区 | 国产一区二区久久 | 国产亚洲久 | 五月天综合影院 | 色视频欧美 | av影片在线| 欧美二区在线 | 在线成人免费视频 | 久久综合久 | 欧美啪啪网站 | 国产东北一级毛片 | 久久一区二区三区免费 | 欧美黄在线观看 | 免费黄色的视频 | 电影在线| 精品国产综合 | 成人免费观看男女羞羞视频 | 一区二区高清 | 色在线免费视频 | 亚洲成年影院 | 九色在线观看 | 一二区视频 | 久久国产精品免费一区二区三区 | 精品国产一区二区三区观看不卡 | 在线观看国产三级 | 久久久九九九九 | 日日夜夜免费精品视频 | 久久精品网 | 日本高清视频在线播放 | 亚洲精品久久 | 中文字幕亚洲欧美日韩在线不卡 | 亚洲免费视频在线观看 | 国产一级片一区二区三区 | 中文字幕亚洲区一区二 | 国产精品资源在线 | 一区二区三区不卡视频 | 九色.com| 中文字幕不卡在线观看 | 看片wwwwwwwwwww| 一区二区三区国产精品 | 九九热精 |