程序员自我修养之Objective-C篇

一、基础语法学习

1、OC使用常量字符串前面必须加一个@

 "jack" : 这是C语言字符串
 @"jack" : 这是OC语言字符串常量

 %p : 打印的是指针变量的数值
 %@ :打印的是指针变量指向的对象

2、@符号的作用

  a、将C语言字符串转化为OC字符串      "jack"       @"jack"
  b、OC绝大部分关键字都是以@符号开头: @property、@synthesize、@synchronize、@selector等

3、BOOL和Boolean区别

  BOOL : 只存储YES和NO
  Boolean :  只存储true和false

4、NSString字符串常用方法

NSString  stringWithUTF8String : 可以把C语言字符串转换为OC字符串
NSString  stringWithFormat : 可以将变量或者其他数据拼接成OC字符串 
NSString  characterAtIndex : 拿到字符串索引下标的字符   [@"abcdefg"  characterAtIndex:2]  结果是c
NSString  isEqualToString : 判断两个字符串内容是否相等
NSString  compare : 比较两个字符串大小

5、nil、Nil、NULL的区别

  • Nil: 表示置空一个类。
  • nil: 一般是指把一个对象置空,完全从内存中释放。(void *)0, 用于OC语言的
  • NULL: (void *)0, 用于C语言的

6、Objective-C的static关键字,只用于修饰变量

  • 修饰全局变量
  • 修饰局部变量

7、self关键字

  • 指向当前对象
  • 指向当前类

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
    
  • 调用方式

    - (void)viewDidLoad {
      [super viewDidLoad];
      SelectorSub *SClass = [[SelectorSub alloc] init];
      //  拿到父类的方法
      SClass.methodTest = @selector(parentMethod);
      [SClass TestChildMethod];
      //  拿到子类的方法
      SClass.methodTest = @selector(SubMethod);
      [SClass TestParentMethod];
    }
    

9、instancetype和id的区别

相同点: instancetype 和 id 都是万能指针,指向对象。
不同点:
a.id在编译的适合不能判断对象的真实类型;instancetype在编译的时候可以判断对象的真实类型
b.id可以用来定义变量,可以作为返回值类型,可以作为形参类型;instancetype只能作为返回值类型
注意:以后凡是自定义构造方法,返回值类型尽量使用instancetype,不要使用id

10、NSStringFromClass()与NSClassFromString区别

  • NSClassFromString使用方式:利用一个字符串来创建一个类

    NSString *responseClass =@“MyModel”;
    MyModel *model=[[NSClassFromString(responseClass) alloc] init];
    
  • NSStringFromClass使用方式:获取与类型名称同名字的字符串

    MyModel *model=[MyModel  alloc] init];
    NSString *responseClass =NSStringFromClass([model class]);
    

二、类的语法学习

1、对象的声明和实现

//类的声明
@interface Person : NSObject {
    @public
    NSString *_name;
    int _age;
    float _height;
}
//无参数
- (void) run;
//一个参数
- (void) eat:(NSString *) foodName;
//返回值 + 多个参数,- :属于对象方法,+: 属于类方法
- (int) sum:(int)sum1 : (int)sum2;       // 属于对象方法
+ (int) sum:(int)sum1 : (int)sum2;      //属于类方法
@end

//类的实现
@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

调用方式:

 Person *person = [Person new];
 //调用参数
 person->_name = @"11111";
 person->_age = 17;
 //调用方法
 [person run];
 [person eat:@"1111111"];
 int sumNumber = [person sum:1:2];
 NSLog(@"sum is %d",sumNumber);

2、@property参数介绍

  • 读写属性 : (readwrite/readonly)

     readwrite : 可读可写,默认
     readonly : 只能读
    
  • 内存管理: (assign/retain/copy/weak/strong)

    assign: 简单赋值,不更改索引计数,适用于基础的数据类型使用。 默认
    retain: 指针拷贝,释放旧的对象,将旧对象的值赋予新对象,引计数+1,深拷贝。适用于NSObject和其子类
    copy: 内容拷贝,释放旧对象,将旧对象的值赋予新的对象,引计数不增加,浅拷贝。适用于NSString类
    strong: 强引用,该对象引用计数为0后才进行释放。    默认
    weak:  弱引用,该对象用完后马上进行释放。
    
  • 原子性: (nonatomic/atomic)

    atomic: 在多线程情况下,编译器会自动生成一些互斥加锁代码,避免该变量的读写不同步问题。默认
    nonatomic: 该对象无需考虑多线程的情况,编译器少生成一些互斥加锁代码,可以提高效率
    

3、@synthesize: 帮助生成成员变量的setter和getter方法的实现。

//使用方式
@synthesize age=_age;
相当于下面的代码:
- (void)setAge:(int)age
{
    _age=age;
}
- (int)age
{
  return _age;
}

4、init和dealloc方法作用

  • init : 用于参数初始化、新创建的对象等。
  • dealloc: 在对象被释放之前调用,用于释放对象占用的资源,如释放实例变量、移除观察者等。

5、NSObject类介绍以及使用

NSObject类是Foundation框架中的类,其他类需继承NSObject后,可以拿到该类的对象的指针。

#import <Foundation/Foundation.h>

@interface Person : NSObject
- (void)sleeping;
- (void)running;
@end

6、description方法

每一个NSObject对象里面都包含description()方法,打印结果是@<对象所属的类型:对象的地址>。相同于java中的toSting()方法可以重写

7、重写init的方法的规范

 @interface Person : NSObject
  
 -(instancetype) init  {
      self = [super init];    //必须调用父类的init初始化,保证父类属性初始化
      if(self) {                   //必须判断是否为空,很有可能初始化失败,返回为nil
         self.name = @"zhangsan";
      }
      retrun  self;
  }      

@end

8、自定义构造init方法的规范

  • 定义方式

     @implementation Person : NSObject
    
      //自定义方法必须以 initWithXXX作为开头,否则self无法使用
     -(instancetype) initWithName: (NSString *)name  {
          self = [super init];    //必须调用父类的init初始化,保证父类属性初始化
          if(self) {                   //必须判断是否为空,很有可能初始化失败,返回为nil
             self.name = name;
          }
          retrun  self;
      }      
    
    @end
    
  • 使用方式

    Person *person = [[Person alloc] initWithName:@"zhangsan"];
    

9、@class使用

  解决相互导入的问题,可以使用@class方式去解决相互依赖问题

10、分类格式

  • 格式

    本类名 + 分类名字     People+Student.h    People+Student.m
    
  • 注意事项
    1、分类只能增加方法,不能增加属性
    2、分类可以使用@property,不能生成私有属性,只能声明getter、setter的声明,不能实现
    3、在分类中不能直接访问本类的私有属性,但可以用getter和setter去访问
    4、分类与本类有相同名字,优先调用分类的方法

  • 分类使用场景

    当一个类有很多方法和模块时候,可以将功能相似的方法写在同一个模块中
    
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,377评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,390评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,967评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,344评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,441评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,492评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,497评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,274评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,732评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,008评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,184评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,837评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,520评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,156评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,407评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,056评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,074评论 2 352

推荐阅读更多精彩内容