亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

IOS開發復習筆記(1)-OC基礎知識

2019-11-14 20:14:07
字體:
來源:轉載
供稿:網友

在上班之余學習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不是垃圾回收,它只是一種編譯器優化,因此它不能處理循環引用的問題:

繪圖1

 

垃圾回收機制如果外部對象到對象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:方法。

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

類或者子類可能會在設置的方法中引用副作用??赡軙幸恍┳缘絅SUndoManager的通知或者事件,除非真的必要,否則這些事件都不應該被忽略。類似的,類或者子類可能會在獲取方法中使用緩存,而直接訪問實例變量則不會用到緩存。

在多線程代碼中直接使用實例變量會突破鎖機制,不用多說后果了吧

不應該用存儲器的地方:

存儲器內部

dealloc方法

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

 

5.分類和擴展

category個人認為是比較好用的??梢詼p少繼承,向現有的類添加新的方法,類似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;


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美与黑人午夜性猛交久久久| 91精品久久久久久综合乱菊| 欧美在线观看日本一区| 精品国产一区二区三区久久狼5月| 中文字幕精品一区二区精品| 日韩成人av在线播放| 午夜免费日韩视频| 国产精品久久久久不卡| 国产精品com| 这里只有精品视频在线| 国产成人综合精品在线| 亚洲一区二区三区成人在线视频精品| 国产精品视频26uuu| 黑人巨大精品欧美一区二区| 欧美激情成人在线视频| 亚洲人成在线免费观看| 国产日产亚洲精品| 久久久久久久久久久av| 欧美老女人在线视频| 日韩网站免费观看| 日韩在线中文字幕| 国产精品999999| 亚洲欧美日韩另类| 亚洲激情视频网站| 91精品视频专区| 日本一区二区三区四区视频| 欧美日韩国产二区| 久久成人国产精品| 国产欧美va欧美va香蕉在线| 亚洲精品日韩久久久| 日韩高清欧美高清| 欧美成人免费大片| 色婷婷综合成人| 日韩精品中文字幕在线| 国内精品视频久久| 久久久久久伊人| 97激碰免费视频| 88国产精品欧美一区二区三区| 亚洲精品电影久久久| 亚洲黄一区二区| 欧美极品少妇xxxxⅹ裸体艺术| 北条麻妃久久精品| 欧美日韩在线影院| 欧美性猛交xxxx黑人猛交| 亚洲伊人一本大道中文字幕| 久久电影一区二区| 日韩av第一页| 免费av一区二区| 91在线免费视频| 91中文字幕在线观看| 国产精品一区二区在线| 91超碰caoporn97人人| 日韩精品一二三四区| 91精品久久久久久久久| 好吊成人免视频| 成人性生交xxxxx网站| 亚洲第一男人av| 日本精品性网站在线观看| 97久久精品视频| 26uuu另类亚洲欧美日本老年| 中文字幕在线精品| 91免费人成网站在线观看18| 欧美国产日本高清在线| 一本大道久久加勒比香蕉| 国产裸体写真av一区二区| 色综合久久88色综合天天看泰| 黑人巨大精品欧美一区二区一视频| 欧美片一区二区三区| 欧美性生交xxxxx久久久| 国产精品揄拍500视频| 欧美性极品少妇精品网站| 成人写真视频福利网| 欧美日韩国产二区| 中文国产成人精品久久一| 最近的2019中文字幕免费一页| 精品久久久久久久久久ntr影视| 国产精品爱啪在线线免费观看| 一区二区三区四区精品| 一区二区在线视频播放| 久久精品夜夜夜夜夜久久| 国产精品免费福利| 久久久亚洲影院你懂的| 国产精品成人观看视频国产奇米| 国产精品亚洲一区二区三区| 国产精品av在线| 日韩在线观看网站| 成人免费视频网址| 欧美成人午夜影院| 麻豆乱码国产一区二区三区| 成人福利免费观看| 久久全国免费视频| 欧美日韩激情视频| 亚洲区在线播放| 久久久久久九九九| 91久久精品美女高潮| 亚洲一区免费网站| 国产精品久久久久久av福利| 久久影视免费观看| 久久久综合免费视频| 一区二区三区久久精品| 91国产一区在线| 精品久久久久久国产| 久久亚洲国产精品| 国产一区二区香蕉| 亚洲国产精品久久久久久| 麻豆国产va免费精品高清在线| 国产精品一区二区久久久久| 国内精品久久久久久影视8| 国产精品一区二区三区久久久| 亚洲性夜色噜噜噜7777| 欧美色欧美亚洲高清在线视频| 久久免费国产精品1| 欧美日本高清一区| 欧美激情一区二区三级高清视频| 8090成年在线看片午夜| 日韩黄在线观看| 欧美日韩成人在线视频| 精品国产网站地址| 国产精品爽黄69| 欧美一级bbbbb性bbbb喷潮片| 欧美专区福利在线| 亚洲www永久成人夜色| 成人h片在线播放免费网站| 成人精品一区二区三区电影免费| 亚洲人成电影网站| 亚洲片在线资源| 永久免费毛片在线播放不卡| 国产97在线|亚洲| 一本一道久久a久久精品逆3p| 日韩网站免费观看| 久久久999精品免费| 欧美精品中文字幕一区| 国产精品久久久久久亚洲调教| 国产一区二区动漫| 中文国产亚洲喷潮| 中文字幕精品久久| 亚洲美女久久久| 日韩国产高清污视频在线观看| 欧美成人中文字幕在线| 日韩久久精品成人| 欧美性高潮床叫视频| 欧美成人精品xxx| 4444欧美成人kkkk| 国产精品老牛影院在线观看| 97色在线视频观看| 亚洲精品xxxx| 91精品国产色综合| 国产v综合v亚洲欧美久久| 国产成人精品综合| 久久久人成影片一区二区三区观看| 国产一区二区三区直播精品电影| 国产91色在线| 欧美精品免费在线| 久久久999成人| 国产一区二区欧美日韩| 亚洲日本中文字幕免费在线不卡| 久久精品99国产精品酒店日本| 欧美黄色片免费观看| 日本sm极度另类视频| 亚洲成人性视频| 亚洲国产精品推荐| 欧美精品久久久久久久免费观看| 欧美色视频日本高清在线观看| 亚洲视频日韩精品|