IOS開發複習筆記(1)-OC基礎知識,ios-oc

來源:互聯網
上載者:User

IOS開發複習筆記(1)-OC基礎知識,ios-oc

在上班之餘學習IOS已經有三個多月了,因為基礎有些薄弱從OC的基本文法開始學習的,相繼看了青柚子和紅柚子的書,現在在看編程實戰,趁這個機會好好的總結一下:

1.命名規範

物件類型和名稱一致,以免混淆

-(void) setURL:(NSString *)URL;//錯誤的命名方法//更改為-(void)setURLString:(NSString *)string;-(void)setURL:(NSURL *)URL;

靜態變數(包括範圍)以s開頭,而全集變數採用g開頭,在通常情況下應避免使用常量之外的全域變數:

static MYThing *sSharedInstance

常量在Cocoa和Core Foundation中以k開頭,在Cocoa中則不是,建議檔案範圍內的(靜態)常量都以k開頭:

static const NSUInteger kMaximumNumberOfRows=3;NSString *const MYSomethingHappenedNotification=@"SomethingHappeded";

方法參數名稱通常要加一個冠詞(a,an,the)(樓主註:貌似不是很常見啊),用這種方式對參數進行命名可以避免與方法中的局部變數和執行個體名稱混淆

執行個體變數以底線開頭

類名以大寫字母開頭,方法名和變數名則應該以小寫字母開頭,所有類名,方法名都採用駝峰式大小寫(即每個單詞的首字母大小寫)進行分隔,而不採用底線

2.自動引用計數

ARC不是記憶體回收,它只是一種編譯器最佳化,因此它不能處理循環參考的問題:

 

記憶體回收機制如果外部對象到對象A的引用連結中斷,則對象A和對象B都會被銷毀,但那時ARC中因為A,B的相互引用,其引用計數都大於1,因此在IOS開發中必須做好對強引用的管理

屬性的關係有兩種主要類型:strong和weak,相當於非ARC環境中的retain和assign,只要存在一個強引用對象就會一直存在,不會被銷毀。而weak在引用的對象被銷毀後,weak的引用會被自動置為nil,所以delegate的屬性總是應該聲明為weak。

3.屬性

在標頭檔聲明公有屬性,.m檔案中聲明私人屬性:

//MyClass.h@interface class: NSObject@property (nonatomic,readwrite,weak) id delegate;@property (noatomic,readonly,strong) NSString *readonlyString;
@end//MyClass.m@interface MyClass() @property (noatomic,readwrite,strong) NSString *readonlyString;@property (noatomic,strong) NSString *privateString;
@end

 

編譯器會自動建立_delegate,_readonlyString,_privateString幾個變數,不過只能再init,dealloc中調用這些執行個體變數

另外可以看到在.m檔案中重新聲明了一下readonlyString變數,為它增加了一個setter的私人方法

屬性的修飾關鍵字:

1)原子性(atomic,nonatomic)

本意是指屬性的存取器方法是安全執行緒的,並不保證整個對象是安全執行緒的。比如使用NSMutableArray聲明一個stuff,使用

self.stuff和self.stuff=otherstuff(只涉及到存取),而採用objectAtIndex的方法訪問數組的時候並不是安全執行緒的。

但是如果屬性並不需要其他線程訪問的時候,使用原子屬性是一種極大的浪費,因此通常情況下採用的是nonatomic

2)讀寫屬性(readwrite和readonly)

3)設定方法修飾的關鍵詞(weak,strong,copy)

注意的是對於不可變類如NSString和NSArray使用copy修飾

屬性是用來表示對象的狀態的,getter方法必須沒有任何外部副作用,執行速度要快,不應該有阻塞。

 

屬性和私人執行個體變數,在@implementation中可以使用私人執行個體變數

如@implementation{

NSString *_name;

}

預設的儲存類型是strong

4.儲存空間

使用的一些範圍,或者說必須使用存取器而最好別用執行個體變數:

KVO(索引值觀察Key-Value Observing)

屬性可被自動觀察,那次修改一個屬性的時候可以調用willChangeValueForKey:和didChangeValueForKey:方法。

副作用(樓主太菜不是很懂副作用)

類或者子類可能會在設定的方法中引用副作用。可能會有一些註冊到NSUndoManager的通知或者事件,除非真的必要,否則這些事件都不應該被忽略。類似的,類或者子類可能會在擷取方法中使用緩衝,而直接存取執行個體變數則不會用到緩衝。

在多線程代碼中直接使用執行個體變數會突破鎖機制,不用多說後果了吧

不應該用儲存空間的地方:

儲存空間內部

dealloc方法

初始化方法:這裡可以用_Value,而不應該用屬性

 

5.分類和擴充

category個人認為是比較好用的。可以減少繼承,向現有的類添加新的方法,類似C#中的擴充方法

分類用於以模組化的方式將一個大型類分解成多個易於維護的類。

分類的聲明非常簡單,跟介面有些相像,在類名後的小括弧裡寫上分類名稱即可:

@interface NSMutableString (Capitalize)

-(void) capitalize

@end

Capitalize為分類的名稱。從技術上講,分類中可以進行方法覆蓋,但是不建議這麼做,如果兩個分類包含了同名的方法,無法預測哪個方法會被使用。

關於分類,合理的使用就是為現有類添加某些適用的方法。使用原先的類名+分類的名稱作為新的標頭檔和實現檔案的名字。

比如為NSDate增加一個MyExtensions的簡單分類:

//NSDate+MyExtensions.h@interface NSDate(MyExtensions)-(NSTimeInterval) timeIntervalUntilNow;@end;//NSDate+MyExtensions.m@implementation NSDate(MyExtensions)-(NSTimeInterval) timeIntervalUntilNow{    return [self timeIntervalSinceNow];}@end

如果只是添加幾個少數使用的方法,比較好的方式就是把這些方法都放在該MyExtensions類中,但是需要權衡一下防止代碼膨脹。

關聯引用為分類添加資料

在分類中不能建立執行個體變數,但是可以建立關聯引用,通過關聯引用為任何對象添加索引值資料。

由於在分類中不能合成屬性,

比如聲明

//person類,並為其增加一個分類 email@interface Person:NSObject@property (nonatomic,copy) NSString *name;@end;@implementation Person@end;//增加一個分類#import <objc/runtime.h>@interface Person(emailAdress)@property (nonatomic,copy) NSString *emailAdress;@end;///如果這麼寫,在引用或者複製的時候出現屬性無法擷取或者複製的錯誤//因為在分類中無法合成屬性//@implementation Person(emailAdress)//@end;//正確的做法@implementation Person(emailAdress)static char emailAdressKey;-(NSString *)emailAdress{return objc_getAssociateObject(self,&emailAdressKey);}-(void) setEmailAdress:(NSString *)emailAdress{objc_setAssociateObject(self,&emailAdressKey,emailAdress,OBJC_ASSOCIATE_COPY);}@end;

可以看到關聯引用是基於key的記憶體位址,而不是鍵的值.

如果在警告面板或者警告的控制項上附加一個相關對象,使用關聯引用是非常好的一個形式.

objc_setAssociatedObject(<#id object#>, <#const void *key#>, <#id value#>, <#objc_AssociationPolicy policy#>)//(目標類執行個體,關聯引用key,關聯引用值
,複製、賦值、保留語義)
objc_getAssociatedObject(<#id object#>,<#const void *key#>)//(目標類執行個體,關聯引用key)
#import "ViewController.h"#import <objc/runtime.h>@implementation ViewControllerstatic const char kRepresentedObject;- (IBAction)doSomething:(id)sender {  UIAlertView *alert = [[UIAlertView alloc]                        initWithTitle:@"Alert" message:nil                        delegate:self                        cancelButtonTitle:@"OK"                        otherButtonTitles:nil];  objc_setAssociatedObject(alert, &kRepresentedObject,                            sender,                           OBJC_ASSOCIATION_RETAIN_NONATOMIC);  [alert show];  }- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {  UIButton *sender = objc_getAssociatedObject(alertView,                                               &kRepresentedObject);  self.buttonLabel.text = [[sender titleLabel] text];}@end

類擴充

看網上說可以算是category的一個匿名類,可以自由聲明合成屬性,但是聲明的方法必須在implementation中實現

6.協議

聲明一個協議

@protocol 名稱 <NSObject>

@required

//必須實現的

@optional

//選擇實現的

協議和類一樣可以繼承,協議總是繼承<NSObject>,NSObject 被劃分為一個類和一個協議

委託協議(delegate protocol)

第一個參數是委派物件,這樣一個委託才能管理多個委派物件

建立協議後還需要一個屬性來便於操作它

@property (nonatomic,weak) id<Mydelegate>delegate;


ios學習筆記哪兒有?自學ios開發合適?

不見得進培訓機構就是能學出來的,不見得交了錢就一定學出來,不過就看你本人有沒有自製能力了。
iOS的應用軟體是Android的1.4倍,而系統開發人員卻是Android的0.38倍,由此可見iOS行業的人才缺口是相當大的。也正因為如此,市場對於Objective-C和C++開發人員的需求極為迫切,使得這兩個職業在就業趨勢上呈相當利好的狀態,最終促使iOS行業大步跨入了朝陽行業。在現下這種供不應求的市場環境中,也促使iOS人才的薪資的上漲幅度要遠高於Android。

未來的10年是移動互連網的時代,這個結論已經成為業界的共識。
1:部署iOS應用是企業戰略必選項
2:大型企業的介入會加劇iOS人才的匱乏
3:iOS領域拒絕代碼工人,所謂的高手不僅精通技術,還要瞭解使用者,瞭解市場,瞭解設計,iOS領域偏向複合型人才和創新型人才
 
學ios開發需要什基礎?幫忙推薦些資料,高人指點,

你可以百度一下IOS開發人員部落格,上面的東西挺全面的。如果你幾年開發經驗,可以自學,如果沒有的話自學很難。
基本流程就是c→oc→UI→做幾個小項目(一定要做)
c語言不用學的太精細,c學深了沒個一兩年學不完,主要是建立一個編程思想。買本iphone開發入門看看。另外斯坦福大學的視頻課程,那個部落格裡也有。
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.