程序员自我修养之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、分类与本类有相同名字,优先调用分类的方法

  • 分类使用场景

    当一个类有很多方法和模块时候,可以将功能相似的方法写在同一个模块中
    
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容