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。
*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對應上,其實就是給實例變量起個別名。
如果需要在set或get中做一些個性化的工作,那麼可以使用@dynamic,這樣getter和setter需要用戶自己實現。
@property(nonatomic, getter=isChosen) BOOL chosen;
==用於比較指針,isEqualToString用於比較字符內容。
.操作符只能運用在setter和getter上。
在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)後點擊右上方的+號,中間麵包就會出現空間麵包,根據需要拖拉空間就可以了:
如下圖所示先雙擊左邊導航欄的Assets.xcassets,會出現右邊的界面,可以把圖片資源直接拖進來,也可以右鍵import,導入資源,可以直接在xcode中修改圖片名字
設置圖片的背景,例如拖拉一個空間後,選中這個空間,這個空間會浮現8個點方便你擴大,縮小,旋轉燈操作,然後訪問右邊工具欄通過右上方的入口(有個向下的小箭頭),選中它(下圖右上方紅色框框圈起來的),就會出現屬性面板,根據個人需要自己配置即可。
特殊字符在edit - Emoji & Symbols,當然也可以通過快捷鍵訪問:control +command+space
打開視圖對照:
視圖關聯代碼:選中按鈕,按住control直接拖到代碼中即可。
閱讀更多 北落師門Orz 的文章