Objective-C笔记大全

1.0 Basic Operations

srand((unsigned)time(0)); //种种子
int index = arc4random() % poker.allCads.count;//不需要种子取随机数
[p retain]; //查看引用计数值
__weak => [p release]; p = nil; //不能分配空间,马上释放

1.1 CopyWithZone

- (id)copyWithZone:(NSZone *)zone {
  Integer *i = [[Integer allocWithzone:zone] initWithInteger:self.ingeger];
  return i;
}

1.2 The judgement of class

- [square isKindOfClass:[TRSquare class]] == YES; //判断是否为子类对象
- [square isMemberOfClass:[TRSquare class]] == YES; //判断是否为成员对象
- [square isSubClassOfClass:[TRSquare class]] == YES; //判断是否为子类
- SEL sel = @selector(study)
- [Student instancesRespondToSelector:sel] == YES //判断类中是否有指定方法
- [stu respondsToSelector:@selector(learn)] == YES //判断对象能否调用指定方法
- [stu performSelector:sel] => [stu study] //执行方法

1.3 Protocol

- Protocol *p = @protocol(NSCopying);
- [Student conformsToProtocol:p] == YES //判断是否采纳指定协议

1.4 NSString

- [str substringToIndex:3]; //截取头,截取从下标0到3的字符
- [str substringFromIndex:10] //截取尾,截取下标10以后的字符
- [str substngWithRange:NSMakeRange(4,4)]; //范围截取,从下标4开始截取4个字符
- str = [str1 stringByAppendingString:str2]; //字符串拼接
- str = [str1 stringByAppendingFormat:@"%@%d",str2,i]; //格式化追加
- str = [str1 stringByReplacingCharactersInRange:NSMakeRange(4,10) withString:@"tedu"]; //指定范围替换
- str = [NSString stringWithContentOfFile:filePath encoding:NSUTF8StringEncoding error:nil]; //文件内容初始化字符串
- str = [NSString stringWithCString:CString encoding:NSASCIIStringEncoding]; //C字符串转为OC字符串

1.5 NSMutableString

- [NSMutableString stringWithcapacity:100]; //预估值初始化
- [NSMutableString stringWithString:@"string"]; //标准化初始化
- [NSMutableString stringWithFormat:@"age:%d",age]; //标准格式化
- [str appendString:@"The String"]; //追加
- [str appendFormat:@"have %lucharacters.",str.length]; //格式化追加
- NSRange range = [str rangeOfString:@"Objective-"];
- [str deleteCharactersInRange:range]; //指定范围删除
- [str replaceCharactersInRange:[str rangeOfString:@"a"] withString:@"another"]; //指定字符串替换

1.6 Packaging & Unpackaging

- NSNumber *i = [NSNumber numberWithInt:a];//封装
- int b = [i intValue];//拆封

- NSNumber *c = [NSNumber numberWithChar:ch];
- char ch1 = [c charValue];

- NSNumber *d1 = [NSNumber numberWithDouble:d];
- double d2 = [d1 doubleValue];

- NSNumber *f1 = [NSNumber numberWithFloat:f];
- float f2 = [f1 floatValue];

- NSNumber *b2 = [NSNumber numberWithBool:b1];
- BOOL b3 = [b2 boolValue];

1.7 NSValue

typedef struct
{
    int x;
    int y;
}TRPoint;

typedef struct
{
    char ch;
    double d;
}TRMyData;

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        TRPoint p;
        p.x = 10;//0xA
        p.y = 15;//0xF
        NSValue *value = [NSValue valueWithBytes:&p objCType:@encode(TRPoint)];//封装
        NSLog(@"%@", value);

        TRPoint p1;
        [value getValue:&p1];//拆封
        NSLog(@"(%d,%d)", p1.x, p1.y);

        TRMyData data = {‘a‘, 3.14};
        NSValue *md = [NSValue valueWithBytes:&data objCType:@encode(TRMyData)];
        TRMyData data1;
        [md getValue:&data1];
        NSLog(@"%c,%g", data1.ch, data1.d);
    }
    return 0;
}

1.8 Description

- NSLog(@"%@", teacher); //输出teacher对象,自动调用重写的description方法

-(NSString *)description
{
    return [NSString stringWithFormat:@"姓名:%@,课程:%@", self.name, self.course];
}

1.9 NSData

#获取世界标准时间
    NSDate *date = [NSDate date];

#获取本地时间方法一
    NSTimeZone *zone = [NSTimeZone systemTimeZone];
    NSInteger integer = [zone secondsFromGMTForDate:[NSDate date]];
    NSDate *localDate = [[NSDate date] dateByAddingTimeInterval:integer];

#获取本地时间方法二
     NSDate *localDate = [[NSDate date] dateByAddingTimeInterval:8*3600];

#获取本地时间方法三
     NSDate *date1 = [NSDate dateWithTimeIntervalSinceNow:8*3600];

#格式化本地时间方法
    NSDateFormatter *dateformatter = [[NSDateFormatter alloc] init];
    dateformatter.dateFormat = @"yyyy-MM-dd hh:mm:ss";//hh:12小时制,HH:24小时制
    NSString *str = [dateformatter stringFromDate:date];

#从1970年1月1日至今所经历的秒数
    NSTimeInterval seconds = [date timeIntervalSince1970];

#从指定时间到当前所经历的秒数
    NSTimeInterval seconds = [date timeIntervalSinceNow];

#两个指定时间之间的秒数
    NSTimeInterval seconds = [time1 timeIntervalSinceDate:time2];

#时间对比
    NSDate *early = [time1 earlierDate:time2]; //较早
    NSDate *later = [time1 laterDate:time2]; //较晚
    [time1 isEqualToDate:time2] == YES //判断两个时间是否相同

#输入一个身份证号码判断年龄
    scanf("%s", str);
    NSString *ID = [NSString stringWithFormat:@"%s", str];
    NSString *birthdayYear = [ID substringWithRange:NSMakeRange(6, 4)];
    NSDate *date = [NSDate date];
    NSDateFormatter *f = [[NSDateFormatter alloc] init];
    f.dateFormat = @"yyyy";
    NSString *thisYear = [f stringFromDate:date];
    int age = [thisYear intValue] - [birthdayYear intValue];
    NSLog(@"年龄是:%d", age);

2.0 NSArray

- NSArray *array3 = [NSArray arrayWithObjects:@"one", @"two", @"three", nil]; //创建数组包含多个元素
- NSArray *array4 = @[@"one", @"two", @"three"]; //优化方法,最常用的方法
- NSArray *array5 = [NSArray arrayWithArray:array4]; //副本
- NSUInteger index = [array4 indexOfObject:@"one"]; //根据元素值求在数组中的下标
- NSArray *stu = @[stu1, stu2, stu3];
  NSArray *copied = [[NSArray alloc] initWithArray:stu copyItems:NO];//NO是引用计数拷贝
  NSArray *deepCopied = [[NSArray alloc] initWithArray:stu copyItems:YES];//YES深拷贝

2.1 NSMutableArray

  • ###创建
- NSMutableArray *array1 = [NSMutableArray array];//空数组,有意义
- NSMutableArray *array2 = [NSMutableArray arrayWithCapacity:100];//预估值
- NSMutableArray *array3 = @[@"one", @"two", @"three"];//arra3会退化成不可变数组
- NSMutableArray *array4 = [NSMutableArray arrayWithObjects:@"one", @"two", @"three"];
  • ###添加
- [array4 addObject:@"four"];//在数组的最后添加一个元素
- [array4 insertObject:@"five" atIndex:1];//在任意下标插入
  • ###删除
- [array4 removeLastObject];//最后一个
- [array4 removeObject:@"six"];//指定元素
- [array4 removeObjectAtIndex:2];//指定下标
- [array4 removeObjectsInRange:NSMakeRange(3, 2)];//指定范围
- [array4 removeObjectsInArray:@[@"one", @"three"]];//指定数组
- [array4 removeAllObjects];//清空数组

2.2 NSSet

   int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSSet *set1 = [NSSet setWithObjects:@"one", @"two", @"three", nil];

        //遍历
        NSLog(@"%@", set1);
        NSArray *array = [set1 allObjects];
        for (int i = 0; i < array.count; i++)
        {
            NSLog(@"%@", array[i]);
        }
        for (NSString *str in set1)
        {
            NSLog(@"%@", str);
        }
        NSEnumerator *e = [set1 objectEnumerator];//枚举器遍历
        NSSet *str;
        while (str = [e nextObject])
        {
            NSLog(@"%@", str);
        }
    }
    return 0;
}

2.3 NSMutableSet

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //创建
        NSMutableSet *set1 = [NSMutableSet set];//空集合,有意义
        NSMutableSet *set2 = [NSMutableSet setWithCapacity:100];//预估值
        NSMutableSet *set3 = [NSMutableSet setWithObjects:@"one", @"two", @"three", nil];

        //添加
        [set3 addObject:@"four"];//一个
        NSLog(@"%@", set3);
        NSArray *added = @[@"five", @"six"];
        [set3 addObjectsFromArray:added];//多个
        NSLog(@"%@", set3);

        //删除
        [set3 removeObject:@"three"];//指定元素
        NSLog(@"%@", set3);
        [set3 removeAllObjects];//清空集合
        NSLog(@"%lu", set3.count);

        //交集
        NSArray *added1 = @[@"one", @"two", @"three"];
        [set3 addObjectsFromArray:added1];
        NSArray *added2 = @[@"one", @"four", @"three"];
        [set2 addObjectsFromArray:added2];
        [set3 intersectSet:set2];//结果被放回set3
        NSLog(@"%@", set3);
        //并集
        [set3 unionSet:set2];
        NSLog(@"%@", set3);
        //从一个集合A中删除另一个集合B中的元素
        [set2 removeAllObjects];
        [set2 addObjectsFromArray:added1];
        [set3 removeAllObjects];
        [set3 addObjectsFromArray:added2];
        [set3 minusSet:set2];
        NSLog(@"%@", set3);
    }
    return 0;
}

2.4 NSDictionary

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //创建
        NSDictionary *dict1 = [NSDictionary dictionaryWithObjectsAndKeys:@"one", @"1", @"two", @"2", @"three", @"3", nil];//标准
        NSDictionary *dict2 = @{@"1":@"one", @"2":@"two", @"3":@"three"};//优化方法
        NSArray *objects = @[@"one", @"two", @"three"];
        NSArray *keys = @[@"1", @"2", @"3"];
        NSDictionary *dict3 = [NSDictionary dictionaryWithObjects:objects forKeys:keys];//由数组
        NSDictionary *dict4 = [NSDictionary dictionaryWithDictionary:dict3];//副本

        //求键值对的个数
        NSLog(@"%lu", dict4.count);

        //获取字典中的所有值
        NSArray *objects1 = [dict4 allValues];

        //获取字典中的所有关键字
        NSArray *keys1 = [dict4 allKeys];

        //根据一个关键字来查找一个值
        NSString *str = [dict4 objectForKey:@"1"];//标准
        str = dict4[@"2"];//优化方法

        //根据多个关键字来找多个值
        NSArray *keys2 = @[@"1", @"4"];
        NSArray *objects2 = [dict4 objectsForKeys:keys2 notFoundMarker:@"no object"];

        //通过值找到对应的关键字
        NSArray *keys3 = [dict4 allKeysForObject:@"three"];

        //排序
        TRStudent *stu1 = [[TRStudent alloc] initWithName:@"张三" andAge:18];
        TRStudent *stu2 = [[TRStudent alloc] initWithName:@"李四" andAge:20];
        TRStudent *stu3 = [[TRStudent alloc] initWithName:@"刘五" andAge:19];
        NSDictionary *dict5 = @{@"1":stu1, @"2":stu2, @"3":stu3};
        NSArray *sorted = [dict5 keysSortedByValueUsingSelector:@selector(compareAge:)];
        for (NSArray *key in sorted)
        {
            NSLog(@"%@ - %@", key, dict5[key]);
        }
        NSArray *sortedName = [dict5 keysSortedByValueUsingSelector:@selector(compareName:)];
        for (NSArray *key in sortedName)
        {
            NSLog(@"%@ - %@", key, dict5[key]);
        }

        //遍历
        NSArray *keys4 = [dict5 allKeys];
        for (NSString *key in keys4)
        {
            NSLog(@"%@-%@", key, dict5[key]);
        }

        NSEnumerator *e = [dict5 keyEnumerator];//关键字枚举器
        NSString *key;
        while (key = [e nextObject])
        {
            NSLog(@"%@-%@", key, dict5[key]);
        }

        NSEnumerator *e1 = [dict5 objectEnumerator];//值枚举器
        TRStudent *stu;
        while (stu = [e1 nextObject])
        {
            NSLog(@"%@", stu);
        }

        for (NSString *key in dict5)//OC循环
        {
            NSLog(@"%@-%@", key, dict5[key]);
        }

        //向文件中写
        [dict2 writeToFile:@"/Users/tarena/Desktop/dict.plist" atomically:YES];

        //从文件中读
        NSDictionary *dict6 = [NSDictionary dictionaryWithContentsOfFile:@"/Users/tarena/Desktop/dict.plist"];
    }
    return 0;
}

2.5 NSMutableDictionary

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //创建
        NSMutableDictionary *dict1 = [NSMutableDictionary dictionary];//空字典,有意义
        NSMutableDictionary *dict2 = [NSMutableDictionary dictionaryWithCapacity:100];//预估值
        NSMutableDictionary *dict3 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"one", @"1", @"two", @"2", @"three", @"3", nil];//标准
        NSMutableDictionary *dict4 = @{@"1":@"one", @"2":@"two", @"3":@"three"};//退化成不可变字典

        //添加
        [dict3 setValue:@"four" forKey:@"4"];//一个
        NSLog(@"%@", dict3);
        NSDictionary *added = @{@"5":@"five", @"6":@"six", @"7":@"seven"};
        [dict3 addEntriesFromDictionary:added];//多个
        NSLog(@"%@", dict3);

        //覆盖
        NSDictionary *dict5 = @{@"1":@"aaa", @"2":@"bbb", @"3":@"ccc"};
        NSMutableDictionary *dict6 = [NSMutableDictionary dictionaryWithCapacity:100];
        [dict6 addEntriesFromDictionary:dict5];
        NSDictionary *dict7 = @{@"1":@"one", @"2":@"two", @"3":@"three"};
        [dict6 setDictionary:dict7];
        NSLog(@"%@", dict6);

        //删除
        [dict6 removeObjectForKey:@"1"];//指定关键字
        NSLog(@"%@", dict6);
        NSArray *keys = @[@"2", @"3"];
        [dict6 removeObjectsForKeys:keys];//多个
        NSLog(@"%@", dict6);
        [dict6 removeAllObjects];//清空字典
        NSLog(@"%lu", dict6.count);
    }
    return 0;
}

2.6 Block

int a = 10;

void (^myBlock)(void) = ^void(void){
    NSLog(@"Block被执行了");
};

double (^myBlock1)(int, int) = ^double(int a, int b){

    return b ? a * 1.0 / b : 0;
};

typedef void(^BlockType)(void);
typedef double(^BlockType1)(int, int);

int g_i = 10;

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        myBlock();
        NSLog(@"%g", myBlock1(2, 3));

        BlockType b1;
        b1 = ^void(void){
            NSLog(@"用Block类型定义的变量");
        };
        b1();

        BlockType1 b2 = ^double(int a, int b){
            return b ? a * 1.0 / b : 0;
        };
        NSLog(@"%g", b2(2, 5));

        //Block与全局变量
        BlockType1 b3 = ^double(int a, int b){
            NSLog(@"%d", g_i);//可以读取全局变量中的值
            g_i = 20;
            NSLog(@"%d", g_i);//可以对全局变量进行赋值

            return g_i + a + b;
        };
        NSLog(@"%g", b3(2, 3));

        //Block与局部变量
        int i2 = 30;
        __block int i3 = 50;
        BlockType b4 = ^void(void){
            NSLog(@"%d", i2);//可以读取局部变量中的值
            //i2 = 40;//不可以对局部变量进行赋值
            i3 = 60;//加block关键字后,可以对局部变量进行赋值
            NSLog(@"%d", i3);
        };
        b4();

        //与数组
        NSNumber *a1 = [NSNumber numberWithInt:10];
        NSNumber *a2 = [NSNumber numberWithInt:8];
        NSNumber *a3 = [NSNumber numberWithInt:20];
        NSNumber *a4 = [NSNumber numberWithInt:2];
        NSNumber *a5 = [NSNumber numberWithInt:15];
        NSArray *num = @[a1, a2, a3, a4, a5];
        NSComparisonResult (^compareInt)(id, id) = ^NSComparisonResult(id obj1, id obj2){
            NSNumber *a1 = obj1;
            NSNumber *a2 = obj2;
            int i1 = [a1 intValue];
            int i2 = [a2 intValue];
            if (i1 < i2)
            {
                return NSOrderedAscending;
            }
            else if (i1 > i2)
            {
                return NSOrderedDescending;
            }
            else
            {
                return NSOrderedSame;
            }
        };
        NSArray *sorted = [num sortedArrayUsingComparator:compareInt];
        NSLog(@"%@", sorted);

        NSArray *strings = @[@"one", @"two", @"three"];
        sorted = [strings sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2){
            NSString *str1 = obj1;
            NSString *str2 = obj2;
            return [str1 compare:str2];
        }];
        NSLog(@"%@", sorted);

        //与字典
        NSDictionary *dict = @{@"1":@"one", @"2":@"two", @"3":@"three"};
        sorted = [dict keysSortedByValueUsingComparator:^NSComparisonResult(id obj1, id obj2) {
            NSString *str1 = obj1;
            NSString *str2 = obj2;
            return [str1 compare:str2];
        }];
        for (NSString *key in sorted)
        {
            NSLog(@"%@-%@", key, dict[key]);
        }

        TRMyClass *myC = [[TRMyClass alloc] init];
        [myC method:^void(void){
            NSLog(@"Block做函数参数");
        }];
        [myC method:^void(void){
            NSLog(@"多态了");
        }];
        [myC getBlock]();
        myC.block = ^void(void){
            NSLog(@"Block作属性");
        };
        myC.block();

        [myC method1:^double(int a, int b){
            return a + b;
        }];
        [myC method1:^double(int a, int b){
            return a * b;
        }];

        NSLog(@"%g", [myC getBlock1](2, 7));

        myC.block1 = ^double(int a, int b)
        {
            return a + b;
        };
        NSLog(@"%g", myC.block1(2, 3));
        myC.block1 = ^double(int a, int b)
        {
            return a * b;
        };
        NSLog(@"%g", myC.block1(2, 3));
    }
    return 0;
}
@implementation TRMyClass
-(void)method
{
    NSLog(@"method被执行了");
}
-(void)method:(MyBlock2)b
{
    b();//回调
}
-(MyBlock2)getBlock
{
    MyBlock2 b = ^void(void){
        NSLog(@"Block作函数返回值");
    };
    return b;
}
-(void)method1:(MyBlock3)b
{
    NSLog(@"%g", b(2, 3));
}
-(MyBlock3)getBlock1
{
    return ^double(int a, int b){
        return a * 1.0 / b;
    };
}
@end

2.7 KVC

    TRDept *dept2 = [[TRDept alloc]init];
    NSMutableDictionary *deptdata = [NSMutableDictionary dictionary];
    deptdata[@"name"] = @"test2";
    deptdata[@"emps"] = @[ed, ee, ef,ed,ee,ef];
    // KVC
    [dept2 setValuesForKeysWithDictionary:deptdata];

2.8 NSBundle

  • 从文件获取内容到数组
    NSString *fullpath = [[NSBundle mainBundle] pathForResource:@"dept_emps.plist" ofType:nil];
    NSArray *dataArray = [NSArray arrayWithContentsOfFile:fullpath];
    NSLog(@"%@",dataArray);
时间: 2024-10-24 06:14:09

Objective-C笔记大全的相关文章

Objective C笔记(第一天)

• OC语言概述 1.早在20世纪80年代早期,Bard Cox发明了Objective C, 是扩充的C,面向对象的编程语言. 2.NEXTSTEP简称NS a.1985年,Steve Jobs成?立了NeXT公司. b.1988年,NeXT SoftWare公司获得了OC的语言授权, NEXTSTEP环境成为了苹果操作系统,创建的开发包.MACOS c.1996年,12月20?日,苹果公司宣布收购了NeXT software公司,NEXTSTEP环境为apple公司下主要开发.发?行操作系统

渗透笔记大全

渗透笔记[ 常见网站程序 ] —————————————————————————————–asp类: foosun(风讯)kesion(科汛)newasp(新云)乔客CreateLive(创力)5uCMSKingCMSDvBBS(动网)BBSxp[博客]zblog[博客]pjblog —————————————————————————————– PHP类:DeDeCms(织梦)ECMS(帝国)PHPCMSPHP168HBcms(宏博)SupeSiteCMSware(思维)Joomla![BBS]

機器學習基石(Machine Learning Foundations) 机器学习基石 手写版笔记大全

大家好,我是Mac Jiang.看到大家对我的博客的支持,非常感动.今天和大家分享的是我在学习机器学习基石时的手写笔记.当时在学习的时候,我把一些我认为重要的东西写了下来,一来是为了加深印象,二来是为了供以后复习之用. 网上的机器学习基石笔记也有很多,但大多是电子版,个人更加倾向于手写版的自由.毛主席曾经说过,"不动笔墨不读书",我觉得这句话非常有道理,以我个人的学习方法而言,是离不开笔墨的. 分享自己的笔记的目的主要是为大家提供一些学习上的帮助,和大家一起讨论学习,当然也可以在以后学

Objective C 笔记

1. 内在管理三种方式: GC(GarbageConnection): 和Java类似,在程序执行过程中,由程序准确的将内在垃圾回收. Reference Count(引用计数):类似于C++的共享指计,会C++的都懂,当一段内在被申请后,就会记录这段内存被使用次数.当次数为0时,被申请的内在就会被释放. 由程序员自行管理,不过要作用C去做这些事情,当然,使用的场景是对内存有很高的要求.因为,OC支持与C混编.

移动端前端笔记大全

1.关闭iOS键盘首字母自动大写 IOS的机子,默认英文输入法状态下,首字母是自动大写的,有时候挺烦人的. 我们写页面的时候有没有办法把这个自动大写关闭呢?autocapitalize的属性可以实现: 在iOS中,默认情况下键盘是开启首字母大写的功能的,如果业务不想出现首字母大写,可以这样: <input type="text" autocapitalize="off" />

jq 笔记大全一

1.页面重新加载 window.location.reload() 2.创建一个div标签, $("<div>") 3. DOM对像直接转为jq 方法用: 比如value 是一个dom 对像, 转为jq方法是 $(value) 4. 如果判断一个dom 对像?? 例:如果一个div 页面提示:htmldivElement 5.一个元素的偏移的方法: offset() 里面有两个方法 left() 和top() 6.height() .widht() 等一些方法:  后面小括

【吐血推荐】牛人收集的163个Javascript学习教程pdf电子书资源合集

不收藏是你的错^_^. 经证实,均可免费下载. 资源名称 资源大小   15天学会jQuery(完整版).pdf 274.79 KB   21天学通JavaScript(第2版)-顾宁燕扫描版.pdf 26.02 MB   5天驾驭JQuery教程.pdf 1.08 MB   ACCP软件开发初级程序员-使用Javascript增强交互效果-北大青鸟.pdf 51.70 MB   Ajax+PHP程序设计实战详解.pdf 84.29 MB   Ajax实战中文版.pdf 2.48 MB   Aj

名著导读《红星照耀中国》读后感4100字

名著导读<红星照耀中国>读后感4100字:<红星照耀中国>名著导读一.作者简介作者:(美国)埃德加·斯诺译者:董乐山埃德加·斯诺,出生于1905年美国堪萨斯城的一个贫苦家庭.他当过农民.铁路工人和印刷学徒.大学毕业后从事新闻工作,在堪萨斯城的<星报>和纽婚的<太阳报>崭露头角.后来他在开往外洋的货船上当了海员,历游中美洲,最后到了夏威夷,仍然为美国一些报纸供稿.1928年,在中国大革命陷入低潮的时候,他来到上海,担任<密勒氏评论报>的助理编辑,后

假若明天来临——《AI.未来》读后感3900字

假若明天来临--<AI.未来>读后感3900字:你有没有想过,如果有一天你被确诊为癌症患者,你会做些什么?你有没有想过,在你百年之后,你希望你的墓碑上刻写着什么内容?在我翻开李开复老师的新书<AI.未来>之前,我希望了解到关于人工智能领域发展的历程和对未来的展望.在合上这本书之后,最让我获益良多的却是作为一个普通的人类,如何在人工智能的大潮中做好自己的思考.如果说<生命3.0>是对人工智能的一次宏观展望,那么<AI.未来>则是作者用自己的微观体感,详述了以现