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];