程序員自我修養(yǎng)之Objective-C篇

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

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

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