黑马程序员_Foundation框架

---------------------- ASP.Net+Unity开发 .Net培训 、期待与您交流!----------------------

结构体

1.NSRange

        NSRange是OC中一个常用的结构体,一般用于查找指定位置范围内的字符串及字符。因为是结构体,所以在用法上和C类似,在定义结构体的方法上既有C的方式也有像OC的方法。一般的定义方法如下:

NSRange s1 = {1,2};
NSRange s2 = {.location = 3, .length = 5};
NSRange s3 = NSMakeRange(2,4);

      前两种定义方法和C的结构体定义方法类似,都是定义结构体变量直接赋值。第三种方法有点像对类进行操作的方法,它是用NSMakeRange这个方法来赋值。定义好结构体后,就可以用它来查找指定范围内的字符串。

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
    NSString *str = @"lsmseed";
    
    NSRange s1 = NSMakeRange(3,4);
    NSLog(@".location = %ld, .length = %ld",s1.location,s1.length);
    
    NSRange s2 = [str rangeOfString:@"seed"];
    NSLog(@".location = %ld, .length = %ld",s2.location,s2.length);
    return 0;
}

      运行结果:

2014-06-09 15:35:28.672 NSrange[697:303] .location = 3, .length = 4
2014-06-09 15:35:28.676 NSrange[697:303] .location = 3, .length = 4
Program ended with exit code: 0

2.NSPoint

       NSPoint作为一个结构体的主要作用就是获取坐标值,所以他有两个成员变量,一个是x,另一个是y。NSPoint使用NSMakePoint()来定义赋值。

3.NSSize

       NSSize表示长度和宽度,这个结构体的两个成员变量分别为width和height。结构体使用NSMakeSize()赋值。

4.NSRect

       NSRect是NSPoint和NSSize的集合体,它表示一个数据的位置和长宽。使用NSRect()来赋值。三种结构体的使用方法:

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
    NSPoint p1 = NSMakePoint(3,4);
    NSSize  s1 = NSMakeSize(10, 10);
    NSRect  r1 = NSMakeRect(1, 2, 3, 4);
    NSLog(@"point = (%f,%f), size = (%f,%f)",r1.origin.x,r1.origin.y,r1.size.width,r1.size.height);
    
    NSRect  r2 = {p1,s1};
    NSLog(@"point = (%f,%f), size = (%f,%f)",r2.origin.x,r2.origin.y,r2.size.width,r2.size.height);
    
    NSRect  r3 = {{1,3},{2,4}};
    NSLog(@"point = (%f,%f), size = (%f,%f)",r3.origin.x,r3.origin.y,r3.size.width,r3.size.height);
    
    return 0;
}

      运行结果:

2014-06-09 15:56:33.628 NSrange[723:303] point = (1.000000,2.000000), size = (3.000000,4.000000)
2014-06-09 15:56:33.631 NSrange[723:303] point = (3.000000,4.000000), size = (10.000000,10.000000)
2014-06-09 15:56:33.634 NSrange[723:303] point = (1.000000,3.000000), size = (2.000000,4.000000)
Program ended with exit code: 0

5.结构体原型

NSRange:

typedef struct _NSRange{

unsigned int location;

unsigned int length;

} NSRange;

NSPoint:

typedef struct_NSPoint{

float x;

float y;

} NSPoint;

NSSize:

typedef struct_NSSize{

float width;

float height;

} NSSize;

NSRect:

typedef struct _NSRect{

NSPoint origin;

NSSize size;

} NSRect;

字符串对象

1.NSString对象的定义

        NSString作为字符串的处理类有着相当强大的功能,内部的方法便于程序员对字符串进行分割定位截取。一般字符串的对象创建方法:

NSString *str = @"lsmseed";
NSString *str1 = [NSString stringWithFormat:@"seed is %@",@"oc"];

2.NSString的方法

       字符串的创建方法还有许多,可以将字符串的初始化以某种编码方式来进行。

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
    NSString *str = [[NSString alloc] initWithFormat:@"seed is lsm"];
    NSLog(@"str = %@",str);
    
    NSString *str1 = [[NSString alloc] initWithUTF8String:"lsmseed"];
    NSLog(@"str1 = %@",str1);
    
    return 0;
}

      运行结果:

2014-06-09 16:23:16.296 str[768:303] str = seed is lsm
2014-06-09 16:23:16.299 str[768:303] str1 = lsmseed
Program ended with exit code: 0

        NSString即有将OC字符串本身进行初始化的方法,也有让C字符串转化成OC字符串的方法。这样将其他字符串转化成OC字符串就可以使用OC的强大功能,从而简化对字符串的繁杂操作。

3.NSString的使用注意

        NSString在使用中创建出的字符串是不能改变的,引用用NSString创建出的字符串引用的对象是常量值。如果想改变NSString字符串一种方法是创建可改变字符串类型NSMutableString或者是创建一个新的引用来保存操作结果。

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
    NSMutableString *str = [NSMutableString stringWithFormat:@"lsm"];
    NSLog(@"str = %@",str);
    
    [str appendFormat:@"seed"];
    NSLog(@"str = %@",str);
    
    NSString *str1 = @"lsm";
    NSLog(@"str1 = %@",str1);
    
    NSString *str2 = [str1 stringByAppendingString:@"seed"];
    NSLog(@"str2 = %@",str2);
    return 0;
}

      运行结果:

2014-06-09 16:46:00.864 str[802:303] str = lsm
2014-06-09 16:46:00.867 str[802:303] str = lsmseed
2014-06-09 16:46:00.868 str[802:303] str1 = lsm
2014-06-09 16:46:00.869 str[802:303] str1 = lsmseed
Program ended with exit code: 0

       NSString相当于常量不能改变,而NSMutableString相当于字符数组可以改变任意元素的值。

数字对象

1.NSNumber的定义

        NSNumber即OC中的数字对象,将数字封装成对象这是OC的基本功能需要。因为OC中有很对类,通过类生成对象是OC面向对象的基础,所以将数字封装成对象便于用OC的语法来进行操作。数字对象的一般定义:

NSNumber n = [NSNumber numberWithInt:10];
NSNumber f = [NSNumber numberWithFloat:2.8];
NSNumber d = [NSNumber numberWithDouble:8.885];
NSNumber s = [NSNumber numberWithShort:20];

2.NSNumber的方法

        NSNumber不仅可以将数字初始化成对象使用,也可以将对象自身的数字取出来当变量使用。

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
    NSNumber *n = [NSNumber numberWithInt:10];
    NSLog(@"int = %d",[n intValue]);
    
    NSNumber *d = [NSNumber numberWithDouble:8.885];
    NSLog(@"double = %f",[d doubleValue]);
    
    NSNumber *c = [NSNumber numberWithChar:'a'];
    NSLog(@"char = %d",[c charValue]);
    return 0;
}

       运行结果:

2014-06-09 18:06:19.041 number[911:303] int = 10
2014-06-09 18:06:19.069 number[911:303] double = 8.885000
2014-06-09 18:06:19.104 number[911:303] char = 97
Program ended with exit code: 0

3.NSValue与NSNumber的使用

         NSNumber可以将数字封装成对象,NSValue可以将结构体封装成对象。NSNumber只能将数字封装成对象,所以NSNumber属于NSValue的子类,也是NSValue的特殊情况。NSValue在使用过程中,接收的对象比NSNumber较为广泛。

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
    NSPoint p = NSMakePoint(3, 4);
    NSValue *v = [NSValue valueWithPoint:p];
    
    NSPoint p1 = [v pointValue];
    NSLog(@"p1.x = %f,p1.y = %f",p1.x,p1.y);
    
    NSSize s = NSMakeSize(1, 2);
    NSValue *v1 = [NSValue valueWithSize:s];
    
    NSSize s1 = [v1 sizeValue];
    NSLog(@"v1.width = %f, v1.height = %f",s1.width,s1.height);
    
    NSRect r = NSMakeRect(1, 2, 3, 4);
    NSValue *v2 = [NSValue valueWithRect:r];
    
    NSRect r1 = [v2 rectValue];
    NSLog(@"r1.x = %f,r1.y = %f,r1.width = %f,r1.height = %f",r1.origin.x,r1.origin.y,r1.size.width,r1.size.height);
    return 0;
}

      运行结果:

2014-06-09 18:43:53.005 value[959:303] p1.x = 3.000000,p1.y = 4.000000
2014-06-09 18:43:53.008 value[959:303] v1.width = 1.000000, v1.height = 2.000000
2014-06-09 18:43:53.009 value[959:303] r1.x = 1.000000,r1.y = 2.000000,r1.width = 3.000000,r1.height = 4.000000
Program ended with exit code: 0

数组

1.NSArray的定义

        NSArray是OC的数组结构。一般OC使用NSArray存对象数据,将这些相同类型的数据组成一个集合,便于对多对象进行操作。一般NSArray的定义方法如下:

NSArray *arr = [NSArray array];
NSArray *arr1 = [NSArray arrayWithObject:@"lsm"];
NSArray *arr2 = [NSArray arrayWithObjects:@"seed",@"buster",nil];

       当数组中有多个对象时,需要加上nil来当作结束符。还有一个快速创建数组的方法如下:

NSArray *array = @[@"sss",@"fff",nil]

2.NSArray的方法

        NSArray的主要方法就是取出数组中的某个元素或遍历出数组中的所有元素的值。

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
    NSArray *arr = [NSArray arrayWithObjects:@"seed",@"buster",nil];
    NSLog(@"arr[0] = %@,arr[1] = %@",arr[0],[arr objectAtIndex:1]);
    NSLog(@"count = %ld",arr.count);
    return 0;
}
        运行结果:
2014-06-09 19:22:46.562 array[1042:303] arr[0] = seed,arr[1] = buster
2014-06-09 19:22:46.567 array[1042:303] count = 2
Program ended with exit code: 0

        取出单个元素的值既可以像C语言那样使用数组名来取值,也可以使用对象的方法来取值。因此,在遍历数组元素的时候也可以这样使用类似的方法。

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
    NSArray *arr = [NSArray arrayWithObjects:@"seed",@"buster",@"strike",@"devl",nil];
    
    for (int i = 0; i < arr.count; i++) {
        NSLog(@"arr[%d] = %@",i,arr[i]);
    }
    
    for (id obj in arr)
    {
        NSLog(@"arr = %@",obj);
    }
    
    [arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSLog(@"%ld - %@",idx,obj);
    }];
    
    return 0;
}

        运行结果:

2014-06-09 19:47:03.669 array[1086:303] arr[0] = seed
2014-06-09 19:47:03.672 array[1086:303] arr[1] = buster
2014-06-09 19:47:03.673 array[1086:303] arr[2] = strike
2014-06-09 19:47:03.674 array[1086:303] arr[3] = devl
2014-06-09 19:47:03.676 array[1086:303] arr = seed
2014-06-09 19:47:03.677 array[1086:303] arr = buster
2014-06-09 19:47:03.678 array[1086:303] arr = strike
2014-06-09 19:47:03.679 array[1086:303] arr = devl
2014-06-09 19:47:03.680 array[1086:303] 0 - seed
2014-06-09 19:47:03.681 array[1086:303] 1 - buster
2014-06-09 19:47:03.682 array[1086:303] 2 - strike
2014-06-09 19:47:03.683 array[1086:303] 3 - devl
Program ended with exit code: 0

        遍历的方法不仅可以使用循环来遍历,也可以使用像java语言中的快速遍历或OC中的block方法来遍历。其中,传入block的方法较为简便,可以自定义遍历的方法和遍历的具体内容。

3.NSArray与NSMutableArray

        NSMutableArray可变数组,可以随意增加和改变数组中的元素同时数组的引用不变,仍旧是原来的数组名作为引用。   

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
    NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"lsmseed" ,@"seedbuster",nil];
    for(id obj in arr)
        NSLog(@"arr1 = %@",obj);
    
    [arr addObject:@"seed"];
    for(id obj in arr)
        NSLog(@"arr add = %@",obj);
    
    [arr removeObject:@"lsmseed"];
    for(id obj in arr)
        NSLog(@"arr remove = %@",obj);
    
    [arr removeObjectAtIndex:1];
    for(id obj in arr)
        NSLog(@"arr removeat = %@",obj);
    
    [arr removeAllObjects];
    return 0;
}

        运行结果:

2014-06-09 20:12:46.710 array[1141:303] arr1 = lsmseed
2014-06-09 20:12:46.713 array[1141:303] arr1 = seedbuster
2014-06-09 20:12:46.714 array[1141:303] arr add = lsmseed
2014-06-09 20:12:46.715 array[1141:303] arr add = seedbuster
2014-06-09 20:12:46.716 array[1141:303] arr add = seed
2014-06-09 20:12:46.716 array[1141:303] arr remove = seedbuster
2014-06-09 20:12:46.717 array[1141:303] arr remove = seed
2014-06-09 20:12:46.718 array[1141:303] arr removeat = seedbuster
Program ended with exit code: 0

        可变数组不改变引用指向,所以可以随意改变数组中的元素。但是NSArray就不行了,NSArray是不可变数组,所以数组的指向一旦指定就不能改变数组中的值。

字典

1.NSDictionary的定义

        NSDictionary即字典,在OC中这个类型也属于集合类型。字典就是通过关键字去找对应的对象,这同小学生查字典找陌生字是一样的道理。只不过OC作为编程语言,定义字典时,是将关键字与对应它的对象用编程技术相关联。定义字典的一般方法如下:

NSDictionary *dict = [NSDictionary dictionary];
NSDictionary *dict1 = [NSDictionary dictionaryWithObjectsAndKeys:@"lsmseed",@"seed",@"lsmseed1",@"devl",nil];
NSDictionary *dict2 = @{@"name":@"address",@"seed":@"china"};

        NSDictionary创建方法较多,其中第三个方法是快速创建方法,可以方便键值对的大量创建。还有一种常规的创建字典的方法,就是用数组来创建字典。这种方法虽然较麻烦,但是在批量数据处理上可以减少大量繁杂的创建工作。

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
    NSArray *name = @[@"lsmseed",@"buster",@"devel"];
    NSArray *address = @[@"china",@"usa",@"canada"];
    
    NSDictionary *dict = [NSDictionary dictionaryWithObjects:name forKeys:address];
    
    for(NSString *obj in dict)
        NSLog(@"key = %@, obj = %@",obj,dict[obj]);
    
    return 0;
}

      运行结果:

2014-06-09 20:57:14.514 dictionary[1347:303] key = china, obj = lsmseed
2014-06-09 20:57:14.518 dictionary[1347:303] key = usa, obj = buster
2014-06-09 20:57:14.528 dictionary[1347:303] key = canada, obj = devel
Program ended with exit code: 0

2.NSDictionary的方法

        字典是集合对象中的一员,所以也具有常用的取出元素,查找元素的方法。

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
    NSArray *name = @[@"lsmseed",@"buster",@"devel"];
    NSArray *address = @[@"china",@"usa",@"canada"];
    
    NSDictionary *dict = [NSDictionary dictionaryWithObjects:name forKeys:address];
    
    NSLog(@"%@",dict);
    NSLog(@"%ld",[dict count]);
    
    NSLog(@"%@",[dict objectForKey:@"china"]);
    NSLog(@"%@",[dict valueForKey:@"usa"]);
    
    NSLog(@"%@",[dict allKeys]);
    NSLog(@"%@",[dict allValues]);
    return 0;
}

        运行结果:

2014-06-10 10:42:38.347 dictionary[527:303] {
    canada = devel;
    china = lsmseed;
    usa = buster;
}
2014-06-10 10:42:38.379 dictionary[527:303] 3
2014-06-10 10:42:38.385 dictionary[527:303] lsmseed
2014-06-10 10:42:38.399 dictionary[527:303] buster
2014-06-10 10:42:38.412 dictionary[527:303] (
    china,
    usa,
    canada
)
2014-06-10 10:42:38.413 dictionary[527:303] (
    lsmseed,
    buster,
    devel
)
Program ended with exit code: 0

        将字典的引用直接打印可以将字典中的键值对一一打印出来。这有点像打印字符串,找到引用后直接打印就能将字符串里的所有内容都打印出去。

3.NSDictionary与NSMutableDictionary

        NSMutableDictionary可变字典,NSDictionary不可变字典。可变字典用于多变的字典引用,方便字典键值对的修改与添加。不可变字典引用指向确定后,指向的内容不能改变但是可以读取。

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
    NSMutableDictionary *mdict = [NSMutableDictionary dictionary];
    [mdict setObject:@"car" forKey:@"id"];
    [mdict setObject:@"car1" forKey:@"10"];
    [mdict setObject:@"car2" forKey:@"20"];
    [mdict setObject:@"car" forKey:@"35"];
    
    NSLog(@"%@",mdict);
    NSLog(@"%@",mdict[@"10"]);
    
    [mdict removeObjectForKey:@"35"];
    NSLog(@"%@",mdict);
    
    [mdict removeAllObjects];
    NSLog(@"%@",mdict);
    return 0;
}

        运行结果:

2014-06-10 10:58:14.156 dictionary[583:303] {
    10 = car1;
    20 = car2;
    35 = car;
    id = car;
}
2014-06-10 10:58:14.169 dictionary[583:303] car1
2014-06-10 10:58:14.171 dictionary[583:303] {
    10 = car1;
    20 = car2;
    id = car;
}
2014-06-10 10:58:14.174 dictionary[583:303] {
}
Program ended with exit code: 0

        NSMutableDictionary的定义与NSDictionary相同,只不过NSMutableDIctionary可以随便添加键值对来扩充字典的元素。如果字典中有key值相同,即关键字的值相同则报错,但是key值对象的对象可以相同。

日期

1.NSDate的定义

        NSDate是OC的日期处理类,它主要用于日期时间提取计算等常规的时间处理。一般OC中日期时间点的定义方法如下:

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
    NSDate *d = [NSDate date];
    NSLog(@"%@",d);
    
    NSDate *d1 = [NSDate dateWithTimeIntervalSinceNow:3];
    NSLog(@"%@",d1);
    
    NSDate *d2 = [NSDate dateWithTimeInterval:5 sinceDate:d];
    NSLog(@"%@",d2);

    NSDate *d3 = [NSDate dateWithTimeIntervalSince1970:5];
    NSLog(@"%@",d3);
    
    return 0;
}

        运行结果:

2014-06-10 11:21:38.081 date[649:303] 2014-06-10 03:21:38 +0000
2014-06-10 11:21:38.082 date[649:303] 2014-06-10 03:21:43 +0000
2014-06-10 11:21:38.083 date[649:303] 1970-01-01 00:00:05 +0000
2014-06-10 11:21:38.085 date[649:303] 2014-06-10 03:21:41 +0000
Program ended with exit code: 0

        默认使用date方法生成的时间点为格林尼治标准时间。也可以将NSDate初始化成距离某个时间点多长时间之后的一个时间点。计算机内部的默认时间是从1970年1月1日开始的,所以在初始化NSDate需要注意使用的方法。

2.NSDate的应用

        日期的时间格式是NSDate的主要应用,NSDate可以将获取到的时间格式化成需要的时间格式。时间格式通过NSDateFormatter来确定,然后将确定的格式输出。

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
    NSDate *d = [NSDate date];
    NSDateFormatter *fma = [[NSDateFormatter alloc] init];
    
    fma.dateFormat = @"yy-MM-dd mm:ss";
    
    NSString *str = [fma stringFromDate:d];
    NSLog(@"%@",str);
    
    fma.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    
    NSString *str1 = [fma stringFromDate:d];
    NSLog(@"%@",str1);
    
    return 0;
}

        运行结果:

2014-06-10 11:48:10.871 date[700:303] 14-06-10 48:10
2014-06-10 11:48:10.873 date[700:303] 2014-06-10 11:48:10
Program ended with exit code: 0

        初始化的格式中,y表示年,写几个y就表示年用几位数输出。其他的格式依次类推都是按照这样的规则来格式化NSDate类型对象。M表示月份,d表示日期,H表示小时,m表示分钟,s表示秒。时间的格式化也可以用字符串进行转化,将一个时间点定义成字符串类型再格式化。

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
    NSString *str = @"2014/05/08 10:20:32";
    
    NSDateFormatter *f = [[NSDateFormatter alloc] init];
    f.dateFormat = @"yyyy/MM/dd HH:mm:ss";
    
    NSDate *d = [f dateFromString:str];
    NSLog(@"%@",d);
    return 0;
}

        运行结果:

2014-06-10 12:20:25.061 date[813:303] 2014-05-08 02:20:32 +0000
Program ended with exit code: 0

集合

1.NSSet与NSMutableSet

        NSSet集合和NSMutableSet集合都能创建随机插入元素的集合,不同点在于一个创建出来不能改变元素的值,一个可以随意改变或插入新元素。而且插入的元素一定是OC的对象。不能插入非OC对象。

      NSSet的定义方法:

NSSet *s = [NSSet setWithObjects:@"seed",@"buster",@"devel", nil];
NSSet *s1 = [[NSSet alloc] initWithObjects:@"lsm",@"dede",@"123", nil];

        NSMutableSet的定义方法:

NSMutableSet *set = [NSMutableSet set];
[set addObject:@"seed"];
[set addObject:@"lsm"];

        NSSet的使用一般比NSArray的效率要高,因为NSSet的查找实现哈希算法不用像NSArray那样全部遍历一遍。

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
    NSSet *s = [NSSet setWithObjects:@"123",@"lsm",@"seed", nil];
    NSLog(@"%@",[s anyObject]);
    NSLog(@"%@",[s allObjects]);
    
    NSMutableSet *s1 = [NSMutableSet set];
    [s1 addObject:@"lsmseed"];
    [s1 addObject:@"buster"];
    [s1 addObject:@"youku"];
    NSLog(@"%@",[s1 anyObject]);
    
    [s1 removeObject:@"youku"];
    NSLog(@"%@",[s1 allObjects]);
    
    NSLog(@"%ld",[s1 count]);
    
    NSLog(@"%d",[s1 containsObject:@"buster"]);
    return 0;
}

      运行结果:

2014-06-10 12:56:56.857 set[989:303] 123
2014-06-10 12:56:56.859 set[989:303] (
    123,
    lsm,
    seed
)
2014-06-10 12:56:56.867 set[989:303] lsmseed
2014-06-10 12:56:56.868 set[989:303] (
    lsmseed,
    buster
)
2014-06-10 12:56:56.872 set[989:303] 2
2014-06-10 12:56:56.873 set[989:303] 1
Program ended with exit code: 0

2.OC的集合对象

      NSSet:用于无序对象集合。
      NSArray:用于有序对象的集合,相当于数组。
      NSDictionary:用于键值对映射。

        以上三种集合一旦初始化之后不能改变。NSMutableSet,NSMutableArray,NSMutableDictionary这三种集合是可变集合与前面的集合对应。

----------------------ASP.Net+Unity开发.Net培训、期待与您交流!----------------------


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值