一、基礎(chǔ)語法學(xué)習(xí)
1、OC使用常量字符串前面必須加一個(gè)@
"jack" : 這是C語言字符串
@"jack" : 這是OC語言字符串常量
%p : 打印的是指針變量的數(shù)值
%@ :打印的是指針變量指向的對(duì)象
2、@符號(hào)的作用
a、將C語言字符串轉(zhuǎn)化為OC字符串 "jack" @"jack"
b、OC絕大部分關(guān)鍵字都是以@符號(hào)開頭: @property、@synthesize、@synchronize、@selector等
3、BOOL和Boolean區(qū)別
BOOL : 只存儲(chǔ)YES和NO
Boolean : 只存儲(chǔ)true和false
4、NSString字符串常用方法
NSString stringWithUTF8String : 可以把C語言字符串轉(zhuǎn)換為OC字符串
NSString stringWithFormat : 可以將變量或者其他數(shù)據(jù)拼接成OC字符串
NSString characterAtIndex : 拿到字符串索引下標(biāo)的字符 [@"abcdefg" characterAtIndex:2] 結(jié)果是c
NSString isEqualToString : 判斷兩個(gè)字符串內(nèi)容是否相等
NSString compare : 比較兩個(gè)字符串大小
5、nil、Nil、NULL的區(qū)別
- Nil: 表示置空一個(gè)類。
- nil: 一般是指把一個(gè)對(duì)象置空,完全從內(nèi)存中釋放。(void *)0, 用于OC語言的
- NULL: (void *)0, 用于C語言的
6、Objective-C的static關(guān)鍵字,只用于修飾變量
- 修飾全局變量
- 修飾局部變量
7、self關(guān)鍵字
- 指向當(dāng)前對(duì)象
- 指向當(dāng)前類
8、SEL(@selector)使用
-
父類 SelectorDemo.h
#import <Foundation/Foundation.h>@interface SelectorDemo : NSObject @property (nonatomic, assign) SEL methodTest; -(void)TestParentMethod; -(void)TestChildMethod; @end -
父類 selectorDemo.m
#import "SelectorDemo.h" @implementation SelectorDemo -(void)parentMethod{ NSLog(@"parent method call success"); } -(void)TestParentMethod{ if (_methodTest) { [self performSelector:_methodTest withObject:nil]; } } -(void)TestChildMethod{ if (_methodTest) { [self performSelector:_methodTest withObject:nil]; } } @end -
子類SelectorSub.h
#import "SelectorDemo.h" @interface SelectorSub : SelectorDemo @end -
子類SelectorSub.m
#import "SelectorSub.h" @implementation SelectorSub -(void)SubMethod{ NSLog(@"sub class method call success"); } @end -
調(diào)用方式
- (void)viewDidLoad { [super viewDidLoad]; SelectorSub *SClass = [[SelectorSub alloc] init]; // 拿到父類的方法 SClass.methodTest = @selector(parentMethod); [SClass TestChildMethod]; // 拿到子類的方法 SClass.methodTest = @selector(SubMethod); [SClass TestParentMethod]; }
9、instancetype和id的區(qū)別
相同點(diǎn): instancetype 和 id 都是萬能指針,指向?qū)ο蟆?不同點(diǎn):
a.id在編譯的適合不能判斷對(duì)象的真實(shí)類型;instancetype在編譯的時(shí)候可以判斷對(duì)象的真實(shí)類型
b.id可以用來定義變量,可以作為返回值類型,可以作為形參類型;instancetype只能作為返回值類型
注意:以后凡是自定義構(gòu)造方法,返回值類型盡量使用instancetype,不要使用id
10、NSStringFromClass()與NSClassFromString區(qū)別
-
NSClassFromString使用方式:利用一個(gè)字符串來創(chuàng)建一個(gè)類
NSString *responseClass =@“MyModel”; MyModel *model=[[NSClassFromString(responseClass) alloc] init]; -
NSStringFromClass使用方式:獲取與類型名稱同名字的字符串
MyModel *model=[MyModel alloc] init]; NSString *responseClass =NSStringFromClass([model class]);
二、類的語法學(xué)習(xí)
1、對(duì)象的聲明和實(shí)現(xiàn)
//類的聲明
@interface Person : NSObject {
@public
NSString *_name;
int _age;
float _height;
}
//無參數(shù)
- (void) run;
//一個(gè)參數(shù)
- (void) eat:(NSString *) foodName;
//返回值 + 多個(gè)參數(shù),- :屬于對(duì)象方法,+: 屬于類方法
- (int) sum:(int)sum1 : (int)sum2; // 屬于對(duì)象方法
+ (int) sum:(int)sum1 : (int)sum2; //屬于類方法
@end
//類的實(shí)現(xiàn)
@implementation Person
- (void) run {
NSLog(@"i am is paopao");
}
- (void) eat:(NSString *) foodName {
NSLog(foodName);
}
- (int) sum:(int)sum1 : (int)sum2 {
return sum1 + sum2;
}
+ (int) sum:(int)sum1 : (int)sum2 {
return sum1 + sum2;
}
@end
調(diào)用方式:
Person *person = [Person new];
//調(diào)用參數(shù)
person->_name = @"11111";
person->_age = 17;
//調(diào)用方法
[person run];
[person eat:@"1111111"];
int sumNumber = [person sum:1:2];
NSLog(@"sum is %d",sumNumber);
2、@property參數(shù)介紹
-
讀寫屬性 : (readwrite/readonly)
readwrite : 可讀可寫,默認(rèn) readonly : 只能讀 -
內(nèi)存管理: (assign/retain/copy/weak/strong)
assign: 簡(jiǎn)單賦值,不更改索引計(jì)數(shù),適用于基礎(chǔ)的數(shù)據(jù)類型使用。 默認(rèn) retain: 指針拷貝,釋放舊的對(duì)象,將舊對(duì)象的值賦予新對(duì)象,引計(jì)數(shù)+1,深拷貝。適用于NSObject和其子類 copy: 內(nèi)容拷貝,釋放舊對(duì)象,將舊對(duì)象的值賦予新的對(duì)象,引計(jì)數(shù)不增加,淺拷貝。適用于NSString類 strong: 強(qiáng)引用,該對(duì)象引用計(jì)數(shù)為0后才進(jìn)行釋放。 默認(rèn) weak: 弱引用,該對(duì)象用完后馬上進(jìn)行釋放。 -
原子性: (nonatomic/atomic)
atomic: 在多線程情況下,編譯器會(huì)自動(dòng)生成一些互斥加鎖代碼,避免該變量的讀寫不同步問題。默認(rèn) nonatomic: 該對(duì)象無需考慮多線程的情況,編譯器少生成一些互斥加鎖代碼,可以提高效率
3、@synthesize: 幫助生成成員變量的setter和getter方法的實(shí)現(xiàn)。
//使用方式
@synthesize age=_age;
相當(dāng)于下面的代碼:
- (void)setAge:(int)age
{
_age=age;
}
- (int)age
{
return _age;
}
4、init和dealloc方法作用
- init : 用于參數(shù)初始化、新創(chuàng)建的對(duì)象等。
- dealloc: 在對(duì)象被釋放之前調(diào)用,用于釋放對(duì)象占用的資源,如釋放實(shí)例變量、移除觀察者等。
5、NSObject類介紹以及使用
NSObject類是Foundation框架中的類,其他類需繼承NSObject后,可以拿到該類的對(duì)象的指針。
#import <Foundation/Foundation.h>
@interface Person : NSObject
- (void)sleeping;
- (void)running;
@end
6、description方法
每一個(gè)NSObject對(duì)象里面都包含description()方法,打印結(jié)果是@<對(duì)象所屬的類型:對(duì)象的地址>。相同于java中的toSting()方法可以重寫
7、重寫init的方法的規(guī)范
@interface Person : NSObject
-(instancetype) init {
self = [super init]; //必須調(diào)用父類的init初始化,保證父類屬性初始化
if(self) { //必須判斷是否為空,很有可能初始化失敗,返回為nil
self.name = @"zhangsan";
}
retrun self;
}
@end
8、自定義構(gòu)造init方法的規(guī)范
-
定義方式
@implementation Person : NSObject //自定義方法必須以 initWithXXX作為開頭,否則self無法使用 -(instancetype) initWithName: (NSString *)name { self = [super init]; //必須調(diào)用父類的init初始化,保證父類屬性初始化 if(self) { //必須判斷是否為空,很有可能初始化失敗,返回為nil self.name = name; } retrun self; } @end -
使用方式
Person *person = [[Person alloc] initWithName:@"zhangsan"];
9、@class使用
解決相互導(dǎo)入的問題,可以使用@class方式去解決相互依賴問題
10、分類格式
-
格式
本類名 + 分類名字 People+Student.h People+Student.m 注意事項(xiàng)
1、分類只能增加方法,不能增加屬性
2、分類可以使用@property,不能生成私有屬性,只能聲明getter、setter的聲明,不能實(shí)現(xiàn)
3、在分類中不能直接訪問本類的私有屬性,但可以用getter和setter去訪問
4、分類與本類有相同名字,優(yōu)先調(diào)用分類的方法-
分類使用場(chǎng)景
當(dāng)一個(gè)類有很多方法和模塊時(shí)候,可以將功能相似的方法寫在同一個(gè)模塊中