NSLog 介绍

NSLog 是 Foundation 框架中的一个函数,用于向标准输出流(stdout)或者标准错误流(stderr)输出日志信息。NSLog 函数的定义如下:

// void NSLog(NSString *format, ...);

// 输出 hello world
NSLog(@"hello world");

// 变量
NSString *name = @"world";
NSLog(@"hello %@", name);

// 多个变量
NSString *name = @"world";
NSString *age = @"18";

NSLog(@"hello %@, age is %@", name, age);

oc 中数据类型

基本数据类型

  • 整型:int、short、long、long long
  • 浮点型:float、double
  • 字符型:char
  • 布尔型:BOOL

指针类型

  • 指针:int _、float _、char *
  • 对象:NSObject _、NSString _、NSArray _、NSDictionary _
  • id 类型:id

block 类型

- void (^blockName)(void) = ^{};

- void (^blockName)(NSString *) = ^(NSString *name){};

特殊类型

  • nil:空对象
  • NULL:空指针
  • Nil:空类
  • SEL:方法选择器

面向对象

类的声明

// 类的声明
@interface Person : NSObject

// 属性
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger age;

// 方法
- (void)eat;
- (void)run;

// 有参方法
- (void)eat:(NSString *)food;

// 多参数方法
- (void)eat:(NSString *)food drink:(NSString *)drink;

// 有返回值的方法
- (NSString *)eat:(NSString *)food drink:(NSString *)drink;

// 静态方法
+ (void)eat;

@end

// 类的实现
@implementation Person

// 方法的实现
- (void)eat {
    NSLog(@"eat");
}

- (void)run {
    NSLog(@"run");
}

- (void)eat:(NSString *)food {
    NSLog(@"eat %@", food);
}

- (void)eat:(NSString *)food drink:(NSString *)drink {
    NSLog(@"eat %@ drink %@", food, drink);
}

// 有返回值的方法
- (NSString *)eat:(NSString *)food drink:(NSString *)drink {
    return [NSString stringWithFormat:@"eat %@ drink %@", food, drink];
}

// 静态方法的实现
+ (void)eat {
    NSLog(@"eat");
}

@end

// 使用
// Person *person = [[Person alloc] init];
// 或者 new
Person *person = [Person new];

// 属性赋值
person.name = @"name";
person.age = 18;

// 方法调用
[person eat];
[person eat:@"food"];
[person eat:@"food" drink:@"drink"];

#pragma mark 使用


#pragma mark -
#pragma mark 用于分组

static 关键字使用

  • static: 修饰局部变量,修饰全局变量,修饰方法,修饰类。
// static 修饰局部变量

- (void)method {
    static int a = 0;
    a++;
    NSLog(@"%d", a);
}

// static 修饰全局变量

static int a = 0;

- (void)method {
    a++;
    NSLog(@"%d", a);
}

// static 修饰方法

static void method() {
    NSLog(@"method");
}

- (void)method {
    method();
}

// static 修饰类

static NSString *name = @"name";

self 与 super 关键字使用

  • self: 指向当前对象的指针。
  • super: 指向当前对象的父类对象的指针。

方法重写

  • 子类重写父类的方法,子类的方法会覆盖父类的方法。
// 父类
@interface Person : NSObject

- (void)eat;

@end


@implementation Person

- (void)eat {
    NSLog(@"eat");
}

@end

// 子类

@interface Student : Person

@end

@implementation Student
// 重写父类的方法
- (void)eat {
    [super eat];
    NSLog(@"eat");
}

@end

// 使用

Student *student = [Student new];
[student eat];

@property 关键字使用

  • @property 用于声明属性,可以自动生成属性的 getter 和 setter 方法。
// 声明属性
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger age;
@property (nonatomic, strong) Person *person;

// 自动生成的 getter 和 setter 方法
- (NSString *)name;
- (void)setName:(NSString *)name;

- (NSInteger)age;
- (void)setAge:(NSInteger)age;

- (Person *)person;
- (void)setPerson:(Person *)person;

// 访问
Person *person = [Person new];
person.name = @"name";

@synthesize 关键字使用

  • @synthesize 用于指定属性的实现,可以指定属性的 getter 和 setter 方法的实现。
  • @property 关键字区别:@property 用于声明属性,@synthesize 用于指定属性的实现。

// 声明属性
@synthesize name = _name;

// 自动生成的 getter 和 setter 方法
- (NSString *)name {
    return _name;
}

- (void)setName:(NSString *)name {
    _name = name;
}

重写构造方法

  • 重写构造方法,可以自定义初始化方法。
// 父类
@interface Person : NSObject

@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger age;

- (instancetype)initWithName:(NSString *)name age:(NSInteger)age;

@end

@implementation Person

- (instancetype)initWithName:(NSString *)name age:(NSInteger)age {
    if (self = [super init]) {
        self.name = name;
        self.age = age;
    }
    return self;
}

@end

// 子类

@interface Student : Person

@property (nonatomic, copy) NSString *school;

- (instancetype)initWithName:(NSString *)name age:(NSInteger)age school:(NSString *)school;

@end

@implementation Student

// 重写父类的构造方法
- (instancetype)initWithName:(NSString *)name age:(NSInteger)age school:(NSString *)school {
    if (self = [super initWithName:name age:age]) {
        self.school = school;
    }
    return self;
}

@end

@class 关键字使用

  • @class 用于声明类,可以解决类的循环引用问题。
// 声明类
@class Person;

// 使用类
@interface Student : NSObject

@property (nonatomic, strong) Person *person;

@end

category 关键字使用

  • category 用于给类添加方法,可以在不修改原有类的基础上,给类添加方法。
// 声明类
@interface Person : NSObject

@end

// 实现类
@implementation Person

@end


// 声明类的分类, 文件名:Person+Category.h

@interface Person (Category)

- (void)eat;

@end

// 实现类的分类

@implementation Person (Category)

- (void)eat {
    NSLog(@"eat");
}

@end

block 代码块

  • block 用于封装代码,可以作为方法的参数,也可以作为方法的返回值。

// block 作为方法的参数
- (void)method:(void (^)(void))block {
    block();
}

// 调用
[self method:^{
    NSLog(@"block");
}];

// block 作为方法的返回值

- (void (^)(void))method {
    return ^{
        NSLog(@"block");
    };
}

// 调用
void (^block)(void) = [self method];

Protocol 关键字使用

  • Protocol 用于声明协议,可以解决类的循环引用问题。
// 声明协议
@protocol PersonDelegate <NSObject>

- (void)eat;

@end

// 使用协议
@interface Person : NSObject

@property (nonatomic, weak) id<PersonDelegate> delegate;

@end

Foundation

  • Foundation 框架是 iOS 开发中最常用的框架,Foundation 框架中包含了很多常用的类,如:NSString、NSArray、NSDictionary、NSDate、NSData 等。

NSString

  • NSString 是 Foundation 框架中的一个类,用于处理字符串。
// 创建
NSString *str = @"hello world";

// 创建空字符串,给与赋值
NSString *str = [NSString string];
str = @"hello world";

// 创建 占位符
NSString *str = [NSString stringWithFormat:@"hello %@", @"world"];

// 长度
NSLog(@"%lu", str.length);

// 比较
NSString *str1 = @"hello";
NSString *str2 = @"world";

NSLog(@"%d", [str1 isEqualToString:str2]);

// 拼接
NSString *str1 = @"hello";
NSString *str2 = @"world";

NSString *str3 = [str1 stringByAppendingString:str2];

// 截取
NSString *str = @"hello world";
NSLog(@"%@", [str substringToIndex:5]);

// 查找
NSString *str = @"hello world";
NSLog(@"%lu", [str rangeOfString:@"world"].location);

// 替换
NSString *str = @"hello world";
NSLog(@"%@", [str stringByReplacingOccurrencesOfString:@"world" withString:@"ios"]);

// 大小写转换
NSString *str = @"hello world";
NSLog(@"%@", [str uppercaseString]);
NSLog(@"%@", [str lowercaseString]);

// 去除空格
NSString *str = @" hello world ";
NSLog(@"%@", [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]);

// 分割
NSString *str = @"hello world";
NSArray *array = [str componentsSeparatedByString:@" "];

// 转换为基本数据类型
NSString *str = @"123";
NSLog(@"%d", [str intValue]); // int 类型
NSLog(@"%f", [str floatValue]); // float 类型
NSLog(@"%ld", [str integerValue]); // long 类型
NSLog(@"%lld", [str longLongValue]); // long long 类型
NSLog(@"%d", [str boolValue]); // bool 类型

NSArray

  • NSArray 是 Foundation 框架中的一个类,用于存储对象。
// 创建
NSArray *array = @[@"hello", @"world"];

// 创建空数组,给与赋值
NSArray *array = [NSArray array];
array = @[@"hello", @"world"];

// 创建数组
NSArray *array = [NSArray arrayWithObjects:@"hello", @"world", nil];

// 常用方法
NSArray *array = @[@"hello", @"world"];

// 长度
NSLog(@"%lu", array.count);

// 取值
NSLog(@"%@", array[0]);

// 遍历
for (int i = 0; i < array.count; i++) {
    NSLog(@"%@", array[i]);
}

for (NSString *str in array) {
    NSLog(@"%@", str);
}

[array enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
    NSLog(@"%@", obj);
}];

// 查找

NSArray *array = @[@"hello", @"world"];
NSLog(@"%lu", [array indexOfObject:@"world"]);

// 截取
NSArray *array = @[@"hello", @"world"];
NSLog(@"%@", [array subarrayWithRange:NSMakeRange(0, 1)]);

// 排序
NSArray *array = @[@"hello", @"world"];
NSLog(@"%@", [array sortedArrayUsingSelector:@selector(compare:)]);

// 转换为字符串
NSArray *array = @[@"hello", @"world"];
NSLog(@"%@", [array componentsJoinedByString:@" "]);

// 去重
NSArray *array = @[@"hello", @"world", @"hello"];
NSLog(@"%@", [array valueForKeyPath:@"@distinctUnionOfObjects.self"]);

NSDictionary

  • NSDictionary 是 Foundation 框架中的一个类,用于存储键值对。
// 创建
NSDictionary *dict = @{@"name": @"name", @"age": @"18"};

// 创建空字典,给与赋值
NSDictionary *dict = [NSDictionary dictionary];
dict = @{@"name": @"name", @"age": @"18"};

// 创建字典
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"name", @"name", @"18", @"age", nil];

// 常用方法

// 长度
NSLog(@"%lu", dict.count);

// 取值
NSLog(@"%@", dict[@"name"]);

// 遍历
for (NSString *key in dict) {
    NSLog(@"%@", dict[key]);
}

[dict enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
    NSLog(@"%@", obj);
}];

// 转换为数组
NSDictionary *dict = @{@"name": @"name", @"age": @"18"};
NSLog(@"%@", [dict allKeys]);

// 转换为字符串
NSDictionary *dict = @{@"name": @"name", @"age": @"18"};
NSLog(@"%@", [dict description]);

// 去重
NSDictionary *dict = @{@"name": @"name", @"age": @"18", @"name": @"name"};
NSLog(@"%@", [dict valueForKeyPath:@"@distinctUnionOfObjects.self"]);

// 排序
NSDictionary *dict = @{@"name": @"name", @"age": @"18"};
NSLog(@"%@", [dict keysSortedByValueUsingSelector:@selector(compare:)]);


// 转换为 JSON 字符串
NSDictionary *dict = @{@"name": @"name", @"age": @"18"};
NSData *data = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:nil];

NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

NSLog(@"%@", str);

// JSON 字符串转换为字典
NSString *str = @"{\"name\":\"name\",\"age\":\"18\"}";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

NSLog(@"%@", dict);


// 字典转换为模型
NSDictionary *dict = @{@"name": @"name", @"age": @"18"};
Person *person = [Person modelWithDict:dict];

// 模型转换为字典
NSDictionary *dict = [person dictionaryWithValuesForKeys:@[@"name", @"age"]];

// 字典转换为模型数组
NSArray *array = @[@{@"name": @"name", @"age": @"18"}, @{@"name": @"name", @"age": @"18"}];
NSArray *array = [Person modelArrayWithDictArray:array];

// 模型数组转换为字典数组
NSArray *array = @[[Person new], [Person new]];
NSArray *array = [Person dictArrayWithModelArray:array];

NSDate

  • NSDate 是 Foundation 框架中的一个类,用于处理日期和时间。
// 创建
NSDate *date = [NSDate date];

// 创建指定时间
NSDate *date = [NSDate dateWithTimeIntervalSince1970:0];

// 创建指定时间
NSDate *date = [NSDate dateWithTimeIntervalSinceNow:0];

// 常用方法
// 获取当前时间

NSDate *date = [NSDate date];

// 获取当前时间戳
NSLog(@"%f", [date timeIntervalSince1970]);

// 获取当前时间戳
NSLog(@"%f", [date timeIntervalSinceNow]);

// 获取当前时间
NSLog(@"%@", [date dateByAddingTimeInterval:0]);

// 获取当前年月日
NSLog(@"%@", [date descriptionWithLocale:[NSLocale currentLocale]]);

NSData

  • NSData 是 Foundation 框架中的一个类,用于处理二进制数据。
// 创建
NSData *data = [NSData data];

// 创建
NSData *data = [NSData dataWithBytes:"hello" length:5];

// 常用方法
// 获取长度

NSData *data = [NSData dataWithBytes:"hello" length:5];
NSLog(@"%lu", data.length);

// 获取指定位置的字节
NSData *data = [NSData dataWithBytes:"hello" length:5];
NSLog(@"%c", ((char *)data.bytes)[0]);

// 转换为字符串
NSData *data = [NSData dataWithBytes:"hello" length:5];
NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);

// 转换为 JSON 字符串
NSData *data = [NSData dataWithBytes:"hello" length:5];
NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);

// JSON 字符串转换为 NSData
NSString *str = @"hello";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];

// 转换为字典
NSData *data = [NSData dataWithBytes:"hello" length:5];
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

// 转换为数组
NSData *data = [NSData dataWithBytes:"hello" length:5];
NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

NSNumber

  • NSNumber 是 Foundation 框架中的一个类,用于处理基本数据类型。
// 创建
NSNumber *number = [NSNumber numberWithInt:10];

// 创建
NSNumber *number = [NSNumber numberWithFloat:10.0];

// 创建
NSNumber *number = [NSNumber numberWithBool:YES];

// 常用方法
// 转换为基本数据类型

NSNumber *number = [NSNumber numberWithInt:10];
NSLog(@"%d", number.intValue);

NSNumber *number = [NSNumber numberWithFloat:10.0];
NSLog(@"%f", number.floatValue);

NSNumber *number = [NSNumber numberWithBool:YES];
NSLog(@"%d", number.boolValue);

// 转换为字符串
NSNumber *number = [NSNumber numberWithInt:10];
NSLog(@"%@", number.stringValue);

// 转换为 JSON 字符串
NSNumber *number = [NSNumber numberWithInt:10];
NSLog(@"%@", number.stringValue);

// JSON 字符串转换为 NSNumber
NSString *str = @"10";
NSNumber *number = [NSNumber numberWithInt:str.intValue];

// 转换为字典
NSNumber *number = [NSNumber numberWithInt:10];
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

// 转换为数组
NSNumber *number = [NSNumber numberWithInt:10];
NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

// 转换为 NSData
NSNumber *number = [NSNumber numberWithInt:10];
NSData *data = [NSJSONSerialization dataWithJSONObject:number options:NSJSONWritingPrettyPrinted error:nil];

// 转换为 NSDate
NSNumber *number = [NSNumber numberWithInt:10];
NSDate *date = [NSDate dateWithTimeIntervalSince1970:number.doubleValue];