關(guān)于Objective-C

一、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ù)

  1. 一個對象作為函數(shù)參數(shù),以值傳遞的方式傳入函數(shù)體
  2. 一個對象作為函數(shù)返回值,以值傳遞的方式從函數(shù)返回;
  3. 一個對象用于給另外一個對象進行初始化(常稱為復(fù)制初始化

oc中雖然不能直接的創(chuàng)建對象,但是oc中函數(shù)調(diào)用,以及返回的時候,傳入的參數(shù)一樣會拷貝一份出來,只不過這個拷貝是一個指針,而不是拷貝的一個對象。返回的時候一樣是拷貝的一個副本,這個副本是指針。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 30,224評論 8 265
  • 最近項目不忙,閑下來回顧開發(fā)過程,發(fā)現(xiàn)自己雖然開發(fā)幾年了,對iOS的一些基礎(chǔ)理解不是很深刻,用的時候也只是停留在用...
    禾乃立川閱讀 334評論 0 2
  • OC語言基礎(chǔ) 1.類與對象 類方法 OC的類方法只有2種:靜態(tài)方法和實例方法兩種 在OC中,只要方法聲明在@int...
    奇異果好補閱讀 4,517評論 0 11
  • 【第十六章】風舞一時 “哦,那還好,快把心給我,剛好趕回去”,舞晴空轉(zhuǎn)哭為笑。 “嗯,你一定要那顆心嗎?我可以給你...
    天澤物語閱讀 241評論 0 2
  • 曾踏上征程 圈起自己的行線 曾回望古今 引發(fā)日月的斑斕 青春年華金如沙 ...
    住我心里閱讀 237評論 0 0

友情鏈接更多精彩內(nèi)容