跟stanford cs 193p學習object c IOS開發(一)

MVC:

Model:模型考慮的是什麼,你的應用程序是什麼(而不是你的程序是如何顯示的),包括:數據,應用算法邏輯都是獨立於UI存在於模型中的。

Controller:你的應用程序如何將Model顯示給用戶(UI邏輯)。

View:controller的隨從(UI界面),Controller要使用的類

.h是公共API文件,存放你想要被訪問的API,.m是其實現。

NSObject是IOS中所有類父類(包括我們自己做的類)。

所有的公共API都在:@interface和 @end之間,所有的API實現都在@implementation和@end之間.

然後要導入基礎框架,通常我們在.h文件中直接導入經過預編譯優化好的頭文件:

例如,假設我們僅需要NSObject,我們可以#import<foundation>,但我們一般直接導入整個模塊#import Foundation或者#import <foundation>,因為這是預編譯及優化好的,所以速度很快,直接導入全部就可以了。/<foundation>/<foundation>

Object c會自動分配和釋放內存,通過strong和weak,它們兩分別代表指針屬性,strong說明指針屬性是強的,因為Object C要知道如何處理內存和堆

@property (strong) NSString *contents,只要在堆中有一個強指針指向它(這是引用計數不是垃圾回收),就不會被回收,只有不再存在任何強指針時,它才會從堆中立刻釋放內存(不是之後的垃圾回收,時立刻釋放)。

weak指針是弱引用,所引用的對象計數不會+1,只要還有strong指針指向它,就會將其留在內存中, 只要不再有強指針指向它,內存就會釋放,此時這個weak指針會被設置為nil,在object c中可以發送消息給nil指針,它會返回0而程序不會崩潰。

指針回顧:

int a = 5; 系統編譯時會對該變量分配地址,若a分配的地址是2000,則該語句的作用就是把常數5保存到地址為2000的單元。這種方式又稱為直接訪問,普通變量存放的是一個值,而指針變量是用來存放變量地址的,例如:

int *pointer;

pointer = &a;//a的地址2000存放到了pointer中了

如果要存取變量a的值,可先找到存放a的地址的變量pointer,取出a的地址(2000),然後取出a的值5。

跟stanford cs 193p學習object c IOS開發(一)

指針和變量

*pointer表示該地址所對應的值。

*:取值操作符,int *pointer這裡的*是聲明該變量為指針變量的意思

&:取址操作符

知道了一個變量的地址,就可以通過這個地址來訪問這個變量,因此又把變量的地址稱為該變量的指針。

nonatomic:同該屬性一同的setter和getter不是線程安全的,為什麼不能是線程安全的呢?因為沒必要,IOS的線程安全通常是在model與model,UI與UI之間的。

@property (strong, nonatomic) NSString *contents

我們不直接訪問實例變量,通過聲明@property IOS會幫我們自動生成get,set,我們可以指定get名稱,但是get,set在實現文件中是看不到的,被隱藏了:

@synthesize content = _content;這行代碼會創造一個帶下劃線前綴的實例變量名,同時使用這個屬性生成getter和setter方法,這裡的content需要跟.h文件中的@property對應上,其實就是給實例變量起個別名。

跟stanford cs 193p學習object c IOS開發(一)

@synthesize詳解

如果需要在set或get中做一些個性化的工作,那麼可以使用@dynamic,這樣getter和setter需要用戶自己實現。

@property(nonatomic, getter=isChosen) BOOL chosen;

==用於比較指針,isEqualToString用於比較字符內容。

.操作符只能運用在setter和getter上。

跟stanford cs 193p學習object c IOS開發(一)

isEqualToString

在objective-C中所有的對象都存活在堆上。

[xxx alloc ] init 這是配套的使用的,init只能調用一次,千萬別調用多次,alloc同樣,不要多次在堆中分配。

定義單個參數的函數:

-(int) match:(NSArray *)otherCards;

定義多個參數的函數:

-(void) addCard:(Card *) card at_Top:(BOOL) atTop;

對應java的語法是:

public void addCard(Card card, bool atTop)

多參數的函數應該這麼理解"addCard:at_Top:"是函數名,card和atTop是參數,所以at_Top實際上是方法名的一部分。

數組操作:cards是NSMutableArray類型,說實話語法有點不適應,但是不難看明白意思是在索引為0的位置插入card對象,第四行是說在末尾插入card對象。

if(atTop) {

[self.cards insertObject:card atIndex:0]

}else{

[self.cards addObject:card]

}

隨機數操作:arc4random() % x:獲取0到x-1之間的整數。

if([self.cards count]) {

unsigned index = arc4random() % [self.cards count];

randomCard = self.cards[index];

[self.cards removeObjectAtIndex:index];

}

創建數組,使用@[]語法來創建一個數組,舉例如下:

-(NSString *) contents {

NSArray *rankStrings = @[@"?", @"A", @"2", @"3",@"4", @"5", @"6", @"7", @"8",

return [rankStrings[self.rank] stringByAppendingString:self.suit];

}

靜態函數,方法前是+號為靜態函數,-號為類函數,例如:

+(NSArray *) validSuits {

return @[@"♥️", @"♦️",@"♣️", @"♠️"];

}

init函數,在OC中,初始化立即發生在allocation之後,我們總是使用init來對類進行內存分配。例如:

Deck *myDeck = [[PlayingCardDeck alloc] init]

僅在調用alloc之後立即調用init方法,以在堆中為該新對象騰出空間。 並且只有在新分配給對象內存的時候調用alloc,其他情況禁止調用。instanceType是一個返回類型,它告訴編譯器該方法返回一個對象,該對象的類型與此消息發送到的對象的類型相同。我們總是使用instanceType為init的返回對象。

-(instancetype) init {

self = [super init];

if(self) {

}

}

return self;

}

XCODE使用:

main.storyboard是我們的視圖,雙擊可以打開手機視圖主界面

Assets.xcassets:圖片資源,1x是用於非視網膜屏;2x用於視網膜屏,原來的點座標的大小乘2;3x:在原來的座標上乘3

拖控件的地方在右上角,打開主視圖(main.storyboard)後點擊右上方的+號,中間麵包就會出現空間麵包,根據需要拖拉空間就可以了:

跟stanford cs 193p學習object c IOS開發(一)

如下圖所示先雙擊左邊導航欄的Assets.xcassets,會出現右邊的界面,可以把圖片資源直接拖進來,也可以右鍵import,導入資源,可以直接在xcode中修改圖片名字

跟stanford cs 193p學習object c IOS開發(一)

設置圖片的背景,例如拖拉一個空間後,選中這個空間,這個空間會浮現8個點方便你擴大,縮小,旋轉燈操作,然後訪問右邊工具欄通過右上方的入口(有個向下的小箭頭),選中它(下圖右上方紅色框框圈起來的),就會出現屬性面板,根據個人需要自己配置即可。

跟stanford cs 193p學習object c IOS開發(一)

特殊字符在edit - Emoji & Symbols,當然也可以通過快捷鍵訪問:control +command+space

跟stanford cs 193p學習object c IOS開發(一)

打開視圖對照:

跟stanford cs 193p學習object c IOS開發(一)

視圖關聯代碼:選中按鈕,按住control直接拖到代碼中即可。

跟stanford cs 193p學習object c IOS開發(一)


分享到:


相關文章: