一、distinction
Objective-C的原意就是在C語言主體上加入面向?qū)ο蟮奶匦浴?/p>
import 是oc導(dǎo)入頭文件的關(guān)鍵字,#import會自動導(dǎo)入一次,不會重復(fù)導(dǎo)入,不會引起交叉編譯。
.h 頭文件:包含類,類型,函數(shù)和常數(shù)的聲明。
.m 源代碼文件。
Objective-C方法與函數(shù)的區(qū)別:
方法是唯對象所有
函數(shù)是不依賴于對象存在的
所有的實例方法默認都是公有的
Objective C的重要數(shù)據(jù)類型:
NSString字符串
CGfloat 浮點值的基本類型
NSInteger 整型
BOOL 布爾型
二、基本語法
1、字符串
NSString* myString = @"My String\n";
NSString* fromCString = [NSString stringWithCString:"A C string"
encoding:NSASCIIStringEncoding];
NSString* anotherString = [NSString stringWithFormat:@"%d %@", 10, @"hello"];
NSLog(@" %@ ",anotherString);
2、方法
帶一個參數(shù)的方法:
- (double)pi;
- (int)square:(int)num;
NumUtil *n = [NumUtil new];
[n square:2];
帶多個參數(shù)的方法:
- (void)setX:(double)x andY:(double)y {
self.x = x;
self.y = y;
}
//new
Point2D *p1 = [[Point2D alloc] init];
//調(diào)用
[p1 setX:0 andY:0];
方法的聲明必須寫在@interface-@end之間,實現(xiàn)必須寫在@implementation-@end之間
3、Interface
@interface MyObject : NSObject {
int memberVar1; // 實體變量
id memberVar2;
}
+(return_type) class_method; // 類方法
-(return_type) instance_method2: (int) p1; // 實例方法
-(return_type) instance_method3: (int) p1 andPar: (int) p2;
@end
加號(+)代表類方法(class method),不需要實例就可以調(diào)用,與C++ 的靜態(tài)函數(shù)相似。
減號(-)即是一般的實例方法。

4、Implementation
Interface區(qū)塊內(nèi)的實體變量默認權(quán)限為protected,宣告于implementation區(qū)塊的實體變量則默認為private。
@implementation MyObject {
int memberVar3; //私有變量
}
+(return_type) class_method {
....
}
-(return_type) instance_method1 {
....
}
-(return_type) instance_method3: (int) p1 andPar: (int) p2 {
....
}
@end
@private 私有成員
@protected 受保護成員,只有當前類或子類可以訪問
@public 公共成員
5、創(chuàng)建對象
alloc 分配內(nèi)存
allocate[??l?ke?t]分配給 allot 撥給
MyObject * my = [[MyObject alloc] init];
//若創(chuàng)建對象不需要參數(shù)
MyObject * my = [MyObject new];
6、a represantative example
-(void) insertObject: (id)AAA atIndex:(NSInteger) BBB
[[myAppObject getArray] insertObject:[myAppObject getObjectToInsert] atIndex:0];
[myAppObject getArray]//獲得數(shù)組MyArray
[myAppObject getObjectToInsert]獲得插入的對象anObj
[myArray insertObject:anObj atIndex:0];實際結(jié)果
在Objective-C 中,id 類型是一個獨特的數(shù)據(jù)類型。在概念上,類似Java 的Object 類,可以轉(zhuǎn)換為任何數(shù)據(jù)類型。
7、數(shù)組
NSMutableArray 和 NSArray 是 ObjectiveC 中使用的數(shù)組類,前者是可變數(shù)組,后者是不可變數(shù)組。
NSMutableArray *aMutableArray = [[NSMutableArray alloc]init];
[anArray addObject:@"哈哈哈哈"];
//nil結(jié)束
NSArray *array4 = [[NSArray alloc] initWithObjects:@"AAA", @"bbb", nil];
NSLog(@"%@", array4);
8、字典
NSMutableDictionary)是由鍵-值對組成的數(shù)據(jù)集合.正如,我們在字典里查找單詞的定義一樣.
通過key(鍵),查找的對應(yīng)的value(值),key通常是字符串對象,也可以是其他任意類型對象。
NSMutableDictionary*aMutableDictionary = [[NSMutableArray alloc]initWithCapacity:0];
[aMutableDictionary setObject:@"firstobject" forKey:@"aKey"];
NSDictionary *dictionary = @{@"key1":@"value1", @"key2":@"value2"};
NSDictionary *dictionary2 = [[NSDictionary alloc] initWithObjectsAndKeys:@"value1", @"key1",
@"value2", @"key2", nil];
NSDictionary *dictionary4 = [NSDictionary dictionaryWithObjectsAndKeys:@"value1", @"key1",
@"value2", @"key2", nil];
字典的一些操作
[dictionary count];//作用:字典中元素個數(shù)
[dictionary objectForKey:@"key1"]; //作用:根據(jù)key找對應(yīng)value
//作用:獲取字典中所有的key返回是一個數(shù)組
[dictionary allKeys];
9、Category 類別
類別用于對已存在的類添加新的方法。可以保證類的原始設(shè)計規(guī)模最小,功能增加在逐步擴展。
使用Category對類進行擴展時,不需要創(chuàng)建子類。
@interface ClassName(CategoryName)
//method declarations
@end
@implementation ……
category和extensions的不同在于后者可以添加屬性。
10、@property&&@synthesize
@property:在@interface自動生成getter和setter方法的聲明
@synthesize:在@implementation自動生成getter和setter方法的實現(xiàn)
@property(nonatomic,retain)Shape *all;
readwrite是可讀可寫特征;生成getter方法和setter方法;
readonly是只讀特性,只生成getter方法.
assign做的事情其實就是拷貝了指針。讓這個屬性只是復(fù)制你所賦給它的值的指針。于是,它們就共同指向了同一個區(qū)域了。
retain retain屬性就是為了解決上述問題而提出的,使用了引用計數(shù),還是上面那個例子,我們給那塊內(nèi)存設(shè)一個引用計數(shù),當內(nèi)被分配并且賦值給a時,引用計數(shù)是1.當把a賦值給b時引用計數(shù)增加到2.這時如果a不再使用這塊內(nèi)存,它只需要把引用計數(shù)減1,表明自己不再擁有這塊內(nèi)存。b不再使用這塊內(nèi)存時也把引用計數(shù)減1.當引用計數(shù)變?yōu)?的時候,代表該內(nèi)存不再被任何指針所引用,系統(tǒng)可以直接釋放掉。此時系統(tǒng)自動調(diào)用dealloc函數(shù),內(nèi)存被回收。
retain 保持
copy就是新創(chuàng)建一塊內(nèi)存區(qū)域,復(fù)制變量的內(nèi)容進來,只是保證了變量的內(nèi)容相同。
Strong 只要某一對象被一個strong指針指向,該對象就不會被銷毀。
nonatomic:非原子性訪問,對屬性賦值的時候不加鎖,多線程并發(fā)訪問會提高性能。不安全,但是效率高。
默認關(guān)鍵字,基本數(shù)據(jù): atomic,readwrite,assign
11、代碼塊Block
block:本質(zhì)就是一個[object-c對象]
Block:- 匿名函數(shù) - 截獲自動變量
Block還可以保存一段代碼,在需要的時候調(diào)用

int (^sumOfNumbers)(int a, int b) = ^(int a, int b) {
return a + b;
};
Block作為函數(shù)參數(shù):
[…… animations: ^{
cell.center = center;}
completion: ^(BOOL finished) {
NSLog("animation %@ finished", finished? @"is": @"isn't");
}];
這里面就用到了void(^ animations)(void)跟void(^completion)(BOOL finished)兩個block
12、構(gòu)造函數(shù)
- (instancetype)initWithName:(char *)name age:(int)age{
self = [super init];//先繼承再說
if (self) {
_age = age;
_name = name;
}
return self;
}
三、questions and answers:
1、 Object-c的類可以多重繼承么?可以實現(xiàn)多個接口么?
Object-c的類不可以多重繼承;
可以實現(xiàn)多個接口,通過實現(xiàn)多個接口可以完成C++的多重繼承。
2、原子(atomic)跟非原子(non-atomic)屬性有什么區(qū)別?
atomic提供多線程安全。防止在寫未完成的時候被另外一個線程讀取,造成數(shù)據(jù)錯誤
non-atomic在自己管理內(nèi)存的環(huán)境中,那么訪問器只是簡單地返回這個值。
3、如何理解MVC設(shè)計模式
Model負責存儲、定義、操作數(shù)據(jù);
View用來展示書給用戶,和用戶進行操作交互;
Controller是Model和View的協(xié)調(diào)者,Controller把Model中的數(shù)據(jù)拿過來給View用。Controller可以直接與Model和View進行通信,而View不能和Controller直接通信。
View與Controller通信需要利用代理協(xié)議的方式,當有數(shù)據(jù)更新時,Model也要與Controller進行通信,這個時候就要用Notification和KVO,這個方式就像一個廣播一樣,Model發(fā)信號,Controller設(shè)置監(jiān)聽接受信號,當有數(shù)據(jù)更新時就發(fā)信號給Controller。
4、NSInteger 與 int的區(qū)別
NSInteger能夠自動匹配, 在32位App中,NSInteger是32位整型,在64位App中,NSInteger是64位整型.
6、堆&棧
棧內(nèi)存系統(tǒng)分配
堆內(nèi)存自己申請
棧:存局部變量、函數(shù)參數(shù)
堆:new malloc申請的變量
全局變量和靜態(tài)變量的存儲是放在一塊的。
7、null與nil
NULL是宏,是對于C語言指針而使用的,表示空指針
nil是宏,是對于Objective-C中的對象而使用的,表示對象為空
8、C++和OC的區(qū)別?
@interface 變量默認的訪問權(quán)限就是 protected
OC中的對象不能直接拿到,只能通過內(nèi)存地址去操作對象

c++中就有了 值傳遞 與指針傳遞的區(qū)別。在java中是沒有的,oc中也是沒有的,因為java與oc創(chuàng)建的對象都相當于是創(chuàng)建的對象的指針,而不能直接的創(chuàng)建對象本身,都是通過這個指針去訪問對象的。
在C++中,下面三種對象需要調(diào)用拷貝構(gòu)造函數(shù):
- 一個對象作為函數(shù)參數(shù),以值傳遞的方式傳入函數(shù)體
- 一個對象作為函數(shù)返回值,以值傳遞的方式從函數(shù)返回;
- 一個對象用于給另外一個對象進行初始化(常稱為復(fù)制初始化)
oc中雖然不能直接的創(chuàng)建對象,但是oc中函數(shù)調(diào)用,以及返回的時候,傳入的參數(shù)一樣會拷貝一份出來,只不過這個拷貝是一個指針,而不是拷貝的一個對象。返回的時候一樣是拷貝的一個副本,這個副本是指針。