yymodel


说明文 2019-09-08 13:18:03 说明文
[摘要]篇一:[yymodel]YYModel使用教程我最近在通读 YYModel 源码,在快速上手使用的时候,发现网上对 YYModel 的使用解释很不完善。哪怕是 YY大神自己的使用说明,我直接复制拿来用也发现有用不了。所以有了这篇文章!这篇文章只对我认为需要补充的说明的方法进行说明。简单用法不再赘述。

【www.shanpow.com--说明文】

篇一:[yymodel]YYModel使用教程


我最近在通读 YYModel 源码,在快速上手使用的时候,发现网上对 YYModel 的使用解释很不完善。哪怕是 YY大神自己的使用说明,我直接复制拿来用也发现有用不了。所以有了这篇文章!这篇文章只对我认为需要补充的说明的方法进行说明。简单用法不再赘述。(复制Json时不要把  //JSON这种同学复制进去,会解析失败的。)
先对 YYModel的协议进行说明!
1.自定义属性映射
+ (nullable NSDictionary*)modelCustomPropertyMapper; 1
2
3
4
5
//自定义类的属性
@property NSString      *name;
@property NSInteger     page;
@property NSString      *desc;
@property NSString      *bookID;
1
2
3
4
5
6
7
8
//JSON
{    "n":"Harry Pottery",    
     "p": 256,    
     "ext" : {        
         "desc" : "A book written by J.K.Rowing."
     },    
     "id" : 100010
}
使用这个方法需要在自定义类里面重写该方法。
2.自定义容器映射
假如你的对象里面有容器(set,array,dic),你可以指定类型中的对象类型,因为YYModel是不知道你容器中储存的类型的。在dic中,你指定的是它 value 的类型。
+ ( NSDictionary*)modelContainerPropertyGenericClass; 1
2
3
4
5
6
@interface YYAuthor : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSDate *birthday;
@end@interface User : NSObject@property UInt64        uid;
@property NSString      *bookname;
@property (nonatomic, strong)   NSMutableArray    *authors;@end
1
2
3
4 {    "uid":123456,    "bookname":"Harry",    
     "authors":[{               "birthday":"1991-07-31T08:00:00+0800",               "name":"G.Y.J.jeff"},
                {               "birthday":"1990-07-31T08:00:00+0800",               "name":"Z.Q.Y,jhon"}]
}
1
2
3
4
\相当于泛型说明
+ (NSDictionary *)modelContainerPropertyGenericClass {    
return @{@"authors" : [YYAuthor class]};
}
3.根据字典返回类型
这个方法是可以根据字典里的 数据 来指定当前对象的类型。我对这个方法的理解,假如 Person 是父类,其子类是 Man,Woman。这个时候你可以根据 dic["sex"]中的 value,比如value为 NSString 的 Man,在重写的方法里 return Man.这个时候,你当前的字典转模型的实例就是 Man的实例对象。(此处的 dic就是网络获取的 Json转成的 Dict。
注:这就是多态。
+ (nullable Class)modelCustomClassForDictionary:(NSDictionary*)dictionary;
1
{    "name":"Jeff",    "age":"26",    "sex":"Man",    "wifeName":"ZQY"}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//.h@interface Person : NSObject
@property (nonatomic, copy)     NSString        *name;
@property (nonatomic, assign)   NSUInteger      age;
@end@interface Man : Person
@property (nonatomic, copy)     NSString        *wifeName;@end@interface Woman : Person
@property (nonatomic, copy)     NSString        *husbandName;
@end
//.m+ (Class)modelCustomClassForDictionary:(NSDictionary*)dictionary {    
    if (dictionary[@"sex"] != nil) {        
        NSString *runClass = dictionary[@"sex"];        
        return NSClassFromString(runClass);
    } else {        
        return [self class];
    }
}
1
2
3 NSData *dataPerson = [self dataWithPath:@"person"];    
Person *person = [Person modelWithJSON:dataPerson];    
[person modelDescription];
这个时候你会发现,当前person的类实际上是 Man,而不是 Person。
4.白名单,黑名单 1
2
+ (nullable NSArray *)modelPropertyBlacklist;                            黑名单
+ (nullable NSArray *)modelPropertyWhitelist;                            白名单
这两个比较简单。
黑名单,故名思议,黑名单中的属性不会参与字典转模型。
白名单使用比较极端,你用了之后,只有白名单中的属性会参与字典转模型,其他属性都不参与。不推荐使用。 1
2
3
4
5
6
7
8
9
//使用了黑名单,将来会剔除黑名单中的属性
+ (NSArray *)modelPropertyBlacklist {    
    return @[@"blackListTest"];
}
//白名单使用比较极端,只有白名单中的可以通过。    正常情况使用黑名单即可。
+ (NSArray *)modelPropertyWhitelist {    
    return @[@"name"];
} 5.更改字典信息
该方法发生在字典转模型之前。 最后对网络字典做一次处理。
- (NSDictionary *)modelCustomWillTransformFromDictionary:(NSDictionary *)dic; 1
2 \原来json{    "name":"Jeff",    "age":"26",    "sex":"Man",    "wifeName":"ZQY"}
\更改后{}
1
2
3
4
5
6
- (NSDictionary *)modelCustomWillTransformFromDictionary:(NSDictionary *)dic{    
    if ([dic[@"sex"] isEqualToString:@"Man"]) {        
        return nil;//这里简单演示下,直接返回 nil。相当于不接受男性信息。
    }    
    return dic;//女性则不影响字典转模型。
}
6.字典转模型补充
- (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic;
1
2
3
4
5
@interface User : NSObject
@property UInt64        uid;
@property NSDate        *created;
@property NSDate        *createdAt;
@property NSString      *bookname;@end 1
{"uid":123456,    "bookname":"Harry",    "created":"1965-07-31T00:00:00+0000",    "timestamp" : 1445534567}
字典转模型结束后createdAt属性应该是空的,因为timestamp 和 createdAt 不一样。但你在这里赋值,手动把timestamp的属性赋值给_createdAt.这个有点类似第一点的 自定义属性映射(本篇文章第一条)。注:此处如果 return NO,dic->model将失败。
1
2
3
4
5
6
- (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic {    
    NSNumber *timestamp = dic[@"timestamp"];    
    if (![timestamp isKindOfClass:[NSNumber class]]) return NO;
    _createdAt = [NSDate dateWithTimeIntervalSince1970:timestamp.floatValue];    
    return YES;
}
7.模型转字典补充
- (BOOL)modelCustomTransformToDictionary:(NSMutableDictionary *)dic;
这个方法和第6条是相对应的关系。这里是model->json 的补充。
假如自己model 中有_createdAt,那 model 转到 json 中的timestamp会被赋值。
1
2
3
4
5
- (BOOL)modelCustomTransformToDictionary:(NSMutableDictionary *)dic {    
    if (!_createdAt) return NO;
    dic[@"timestamp"] = @(_createdAt.timeIntervalSince1970);    
    return YES;
}
注:此处如果 return NO,model->dict将失败。
8.字典用法和数组的用法
1
2
+ (nullable NSArray *)modelArrayWithClass:(Class)cls json:(id)json;
+ (nullable NSDictionary *)modelDictionaryWithClass:(Class)cls json:(id)json;
1
2  [{"birthday":"1991-07-31T08:00:00+0800",  "name":"G.Y.J.jeff"},
  {"birthday":"1990-07-31T08:00:00+0800",  "name":"Z.Q.Y,jhon"}]
1
2
3
4
@class YYAuthor;@interface YYAuthor : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSDate *birthday;
@end
1
2
3     NSData *dataArr = [self dataWithPath:@"arrayTest"];    
    NSArray *arrT = [NSArray modelArrayWithClass:[YYAuthor class] json:dataArr];    
    NSLog(@"arrT = %@",arrT); + (NSDictionary *)modelDictionaryWithClass:(Class)cls json:(id)json;
这个方法的意思是只会在对字典的 value 用cls去解析。无法解析key:{key:value(cls)},这种嵌套的解析无法进行。只会解析第一层的。
1
2
3
4
5
6
7
8
9
10
11
12
{
"user1": {    
    "birthday":"1990-07-31T08:00:00+0800",    
    "name":"1Z.Q.Y,jhon"},
"user2":{    
    "birthday":"1990-07-31T08:00:00+0800",    
    "name":"2Z.Q.Y,jhon"},
"user3":{"user4":{    
    "birthday":"1990-07-31T08:00:00+0800",    
    "name":"3Z.Q.Y,jhon"}
    }
}
1
2
3     NSData *dataDict = [self dataWithPath:@"dicTest"];    
    NSDictionary *dicT = [NSDictionary modelDictionaryWithClass:[YYAuthor class] json:dataDict];    
    NSLog(@"dicT = %@",dicT); 如果对使用方法还略有不懂,可以下载我的 github 上的工程。里面都是经过测试的。
下面的源码是我在读 YYModel 时添加的大量备注,和 YYModel 的简单使用介绍。
源码地址 :https://github.com/PomTTcat/YYModelGuideRead_JEFF
这篇文章没讲 model->json,因为那个太简单了。平时使用重点是json->model。
最后的最后,哪里不明白可以一起交流技术!

篇二:[yymodel]街拍一组——模特丫丫


街拍一组——模特丫丫
丫丫-深圳摄影本色团队主力模特-表现佳

篇三:[yymodel]2015移动开发之iOS回顾


2015是移动技术快速发展的一年,基于Apple平台的技术也发展迅速。iPhone6s/iPhone6s plus、iPad pro等新设备发布,iOS9、watchOS 2、OS X EL Capitan、tvOS等新的平台,Swift开源及Swift 2发布,React Native、JSPatch等开源社区也一片繁荣。但同时XcodeGhost等后门事件对于我们关注iOS安全也敲响了警钟。
PS:本文不是一篇技术深入的文章,只是对技术的回顾,如对某一技术点感兴趣,可详细参考对应的推荐链接。如有遗漏的地方,欢迎评论中补充~
(一)iOS App适配64位
2015年开年,让所有iOS开发者头疼的一件事就是苹果所有app自2015年2月1号起,所有提交审核的App必须适配64位,目的是能充分利用64位ARM处理器的高性能支持,让应用能够拥有更为极致的体验。(iPhone5s开始的A7处理器开始支持64位CPU)
对于App适配64位Apple也给出了方法:
Architectures支持在Xcode Building Setting中Architectures为 Standard architectures(include 64-bit)。注意:支持指令集是通过编译生成对应的二进制数据包实现的,如果支持的指令集数目有多个,就会编译出包含多个指令集代码的数据包,造成最终编译的包很大。这也是支持64位后App体积变大的主要原因。参考,ARM指令集对应的硬件ARMv8/ARM64iPhone 6s(Plus),iPhone 6(Plus), iPhone 5s, iPad Air(2), Retina iPad Mini(2,3)ARMv7siPhone 5, iPhone 5c, iPad 4ARMv7iPhone 4, iPhone 4S, iPod 3G/4G/5G, iPad, iPad 2, iPad 3, iPad Mini
数据类型导致的变化导致问题:在32位CPU和64位CPU上整型和浮点型的字结数和字节对齐的方式都不一样,从而导致App如果按照32-bit的写法去适配64位会出现很多溢出、移位等内容问题。同时适配64位可能会导致一些其它问题。1)增加内存压力。2)64位到32位数据之间的相互转化,增加了一些性能开销。3)计算可能产生不同的结果。4)当把一个值从大的数据类型拷贝到小的数据类型,数据可能被截断,如NSInteger -> int。解决办法:解决办法需要遵循数据类型的编码规范,苹果也给出了官方的建议及规范,同时也可以参考,在这里也就不详细展开,毕竟适配64位在当前应不算是问题。
方法调用导致的变化基于32-bit的CPU和基于64-bit上的CPU有不同数量的寄存器,在方法调用上有不同的协议。因此32位和64位在汇编层级上是不同的。如果我们在程序中不使用汇编,调用协议很少会遇到。
第三方库支持64位适配中其实最坑的是第三方库的支持,对于即时更新的第三方库还好(如AFNetworking,SDWebImage),但是对于一些更新较慢或者已经停止更新的Framework(如wax,作者已经停止维护),那就比较坑。当初在公司项目中,需要提前适配64位,记得当初就一直联系新浪微博SDK开发希望能够极早支持64位,我个人在公司中开发的LoginSDK组件也第一时间对64位给予了支持。
(二) WWDC 2015
WWDC 2015发布了三大平台的更新iOS 9、watch OS 2、OS X EL Capitan,同时发布了Apple Music。
iOS 9
iOS 9发布
主要更新以下亮点功能角度:1) Siri语音助手智能化,性能提升40%。2) Apple News新闻聚合App发布,但很遗憾中国内地被禁用。3) Wallet应用取代Passbook。4) iOS自带应用更新:引入Transit通勤路线功能、记事本可以云共享、carplay可自动连接、carplay可自动连接等。5) 续航优化,支持低功耗模式,平均续航能力可延长3个小时。6) 更新iOS 9剩余容量只需1.3GB,之前更新至少需要4GB以上。7)iPad引入双屏模式。
技术角度1) 3D Touch目前支持3D Touch的设备只有 iPhone 6s 和 iPhone 6s Plus。
Pressure Sensitivity:压力灵敏度,可以和绘画类及其它创作型软件结合使用,如根据压力的大小来改变笔触/画线的粗细值。主要为UITouch类增加了一些新属性,例如 estimatedProperties(触摸属性),updatedProperties(触摸对象更新)等,新增的API,主要集中在获取X/Y坐标时的精度部分,如 - PreciseLocationInView:,- PrecisePreviousLocationInView:等。需要特别注意的是UIForceTouchCapability,使用功能前,必须进行功能可用性检测。
Peek and Pop:新引入的手势,主要可以让用户预览内容,甚至进行操作。
Home Screen Quick Actions:快捷菜单,涉及API主要是:UIApplicationShortcutItem。ShortcutItem分了2种类型:静态 & 动态。其中静态方式在info.plist中进行配置;动态则通过UIApplicationShortcutItem等API进行动态配置处理。系统默认会优先展示静态的Actions。若App安装后从未打开时,则默认只会展示静态Actions。
2) SearchiOS 9中用户可以更容易搜索到他想要的内容(不管是在App还是在web上),增强了Search的功能,对应的技术点主要涉及3个API。
NSUserActivity:NSUserAcitivity在介绍 iOS8 的 Handoff 时引入,iOS9 中允许对这些 activities 进行搜索。你可以提供元数据给这些 activities, 这意味着 Spotlight 可以索引这些内容。
CoreSpotlight.framework:新增framework,提供了增、删、改、查等搜索API,可以索引App的内容。
Web Markup:Web内容可被搜索。iOS 9支持灵活的通用无缝链接(universal links介绍),用户来你的网站或直接到您的应用程序,不管你是否已经安装了App。详细可以学习Apple Develop文档。3) Multitasking
Slide Over
iOS9 Slide Over
Slide Over适用于iPad air以及iPad mini2以后的所有机型。iPad简单分屏功能,左侧原来的App占据屏幕的70%面积,右侧是30%,右侧App出来后进入活跃状态,左侧的App,所有基本活动将中断,但是并没有进入后台。
Split ViewSlide Over和Split View可以互相转换,只要用户点击一下Slide Over界面旁边的白色竖条按钮。目前Split View只支持iPad中性能最高的iPad Air 2。两个app并列呈现在屏幕上,其中左侧的app是primary app,右侧的app是secondary app。用户可以滑动两个app之间的分界线,当分界线滑倒最左侧时,secondary app将变成primary app。
iOS9 Split View Picture in picture(PiP)Pip允许你在退出App时,同时观看视频类的App,如下图所示:
Pip
Pip涉及AVKit、AV Foundation或WebKit等相关框架类的视频播放接口。1) AVKit框架提供了 AVPlayerViewController 类,它会为用户自动显示画中画按钮。如果你使用AVKit 支持PiP功能,但要退出特定的画中画视频,请将播放器视图控制器的 allowsPictureInPicturePlayback 属性设置为NO。2)AVKit还提供了 AVPictureInPictureController 类,可以和AV Foundation 框架的 AVPlayerLayer 类一同使用。如果你想为视频播放提供自己的视图控制器和自定义用户界面,可使用这个方法。3)同时WebKit框架提供了 WKWebView 类,它支持iOS 9的PiP功能。如果你使用WebKit支持PiP功能,但要退出特定视频的画中画。设定关联webView 实例的allowsPictureInPictureMediaPlayback属性为NO。
注意:如果你的App使用Media Player 框架播放视频,无论使用其框架中的MPMoviePlayerController或MPMoviePlayerViewController类,你必须迁移使用AVKit或AV Foundation。Media Player视频播放正式在iOS 9中弃用。
在iOS9中Multitasking支持一下机型:
iPad Multitasking支持机型
详细Multitasking相关技术可参考Multitasking Apple Develop文档,或者CocoaChina上的Multitasking翻译文档。
4) App thinningiOS App瘦身一直是开发者关注的问题,iOS 9推出了App thinnig,包括三部分功能:slicing、on-demand resources、bitcode。可让你的iPhone能够腾出更多的剩余空间,在应用升级过程中使用更少的数据。
slicing如下图所示:
slicing
slicing可以对应用进行分割,根据用户设备类型和屏幕分辨率的不同分发定制化下载包,开发者只需要把完整应用包的内容上传到iTunes Connect即可。
bitcodeBitcode是一个已编译程序的中间代码。如果你上传到iTunes Connect里的应用包含bitcode的话,就可以被编译和链接到App Store。加入Bitcode可以让苹果在未来对你的应用二进制文件进行再次优化,而不需要你向App Store提交新版本。注意:对于iOS,bitcode是可选的;对于watchOS,bitcode是必须的;而Mac OS是不支持bitcode。但是对于iOS App来说,如果你的App提供bitcode,那么App里的所有第三方框架都必须支持bitcode。我在公司内部开发的网易通行证LoginSDK登陆组件也第一时间支持了bitcode,在适配bitcode前请确定是否第三方库支持,否则需要寻求对应开发者的帮助。
on-demand resources开发者可以把App初始化用不到的资源分类打包上传到AppStore,在用户使用的时候系统会根据资源标签在必要的时候调用资源,当某些资源不再使用的时候会被系统自动清除。如下图所示:
on-demand resources 下载和管理按需加载资源是由操作系统完成的。app使用NSBundleResourceRequest来:a) 请求获取按需加载资源。b) 通知操作系统某些资源不再使用。c) 更新下载的优先级。d) 追踪下载的进度。e) 检查存储空间不足的通知。当已下载的某些资源不再使用时,可以用NSBundle中的方法来设置保存优先级。
详细on-demand resources介绍可以参考Apple Develop on-demand resources guide。
7) 其它a) 新增3种的App Extension Points:Network、Safari、Spotlight。b) 新增Contacts Framework,与此同时废除AddressBookUI Framework。c) Watch Connectivity,由于watchOS 2的架构变化,需要这么一个东西来对iPhone和Watch进行双向通信。d) UIKit新增,如UIStackView。e) 新增Safari Services Framework。f) 游戏方面新增了更多的Api,涉及GameplayKit、Model I/O Framework、MetalKit三方框架。g) iOS 9.1新增UITouch对Apple Pencil API的支持,详细参考。
7) 适配iOS9关于适配iOS 9就不一一展开介绍,主要涉及到以下几个点,详细可以参考Github iOS9适配详解a) 网络适配ATS:改用更安全的HTTPs。b) 更灵活的后台定位。c) 企业级分发,默认不能安装,需要在设置里点击“信任”。d) 适配Bitcode。e) URL Scheme 适配引入白名单概念,打开第三方App需要注册在URL中注册白名单。f) iOS9更改了字体,字体间隙变大导致 UI 显示异常。
8) iOS 9.2发布。
watchOS 2
watchOS 2相对于上个版本做了很多改进。watchOS 2 的主要变化跟早期的 iPhone 差不多,那就是增加了本地化的 app。苹果向开发者提供了全新的 WatchKit,也就是说从 watchOS 2 开始,应用开发者可以基于 Apple Watch 开发一些应用,应用可以通过 API 调用数码表冠、麦克风甚至 Tapic Engine 等功能,应用获取的健康数据也可以直接在 Apple Watch 上进行处理,不需要再传输到 iPhone。如下图所示:
watchOS 2架构演变
同时watchOS 2新增了ClockKit Framework,可以将你的Watch App相关信息同时显示在表的钟面上。关于watchOS 2的更多介绍可以参考Apple Develop文档
OS X EL Capitan
OS X EL Capitan
WWDC 2015同时发布了OS X EL Capitan版本。El Capitan从窗口管理、内置app和搜索等方面优化了Mac体验,并提升了性能,令启动和切换app、打开PDF文件以及访问电子邮件等日常事务都变得更加快速。关于OS X EL Capitan的技术点详细讲解也超出了本文的范围,详细可以参考Apple Develop文档。
(三)Swift
2015最让人兴奋的事之一莫过于Swift 2.0发布及Swift宣布开源,Swift社区及开源库也发展迅速。
Swift 2.0WWDC 2015发布了Swift 2.0版本,苹果针对此门语言做了很多改进及抱有很多的期望,同时承诺年底前开放Swift的源码。Swift 2.0主要引入以下新特性:1) 增加guard语句。2) 增加异常处理机制。3) 协议可扩展。4) 打印语句的语法改变。5) 增加available检查。6) do-while语句重命名。7) 增加defer关键字。详细介绍可参考。
Swift 3.03.0版本将在2016年秋天发布。Swift 3.0承诺会保持 ABI(Application Binary Interface)的稳定性:成功保持 ABI 稳定性意味着,即便源代码语言发生了变化,用以后版本的 Swift 开发的应用程序和编译库能在二进制层次上和 Swift 3.0 版本的应用程序和编译库相互调用。1)Swift API优化,废弃冗长的Objective-C式风格。2)废弃函数柯里化声明(苹果认为柯里化声明语法太过复杂)。3)废弃var形式的行参。4)废弃++ & --运算符(C语言遗留)。5.废弃for-loops(C语言遗留)
Swift开源2015年12月4号Swift宣布开源。苹果开源了Swift 三大库。1) Swift Complier & Standard Library(Swift编译器&基础库)编译器主要负责Swift的语法解析&语义分析,将Swift语言编译成高效可执行的机器代码,同时前端提供比如Swift语法高亮,代码自动补全等一些便捷的工具(想读懂这块源码要有编译器的基础知识,词法分析、语法分析......)。Swift基础库主要包括各种数据类型,如基础类型、协议、方法、集合及集合所遵循的协议和操作数据类型的基础算法。Swift的基础库底层是以Swift来实现的,更多的功能细分可以参考Swift官方博客-编译器&基础库基本介绍。2) Swift Package Manger(Swift包管理器)Swift主要是用来管理和共享Swift代码的工具,与Swift build system协调来自动处理Swift的下载,链接及依赖处理。 ( max howell 与mattt参与开发,mattt竟然跳槽去了苹果)。同时苹果官方也给出了一个 demo来教你怎样写一个Library Package,同时处理各个Packages之间的依赖(demo :example-package-dealer ,感兴趣的同学可以动手写下)。3) Swift Core Library(Swift核心库)Swift核心库提供了比基础库更高级的功能,基于 Swift 标准库。这些库提供的函数有:定位,网络,多线程,单元测试,数据持久化,文件系统访问,用户参数等功能。Swift核心库的功能将会在Swift 3.0发布,个人预计Swift 3.0将会在2016 WWDC发布。目前核心库开源了三个库Foundation、libdispatch(GCD)、XCTest(单元测试框架),这三大框架也将会随3.0发布,目前处在早期开发阶段。
(四)tvOS
tvOS
Apple TV在国内没有销售,随着近年Apple TV新品的发布,全新的第四代Apple TV 采用A8 芯片,性能更胜以往,因此开发者可为电视打造引人入胜的游戏和定制内容的 app。同时,Apple也发布了tvOS系统,该系统也是基于iOS系统,也内置了App Store。国外Netflix、HBO、Hulu等视频平台均已推出根据tvOS重新制作了对应版本的app,同时在开源社区上许多开源组件也对tvOS给予了支持。详细的tvOS开发文档参考及tvOS human-interface-guidelines如AFNetworking支持iOS, OS X, watchOS, and tvOS全平台。未来关于Apple TV在国内的销售仍然不明,不过个人对tvOS的发展还是很看好的。
(五)XCodeGhost
2015令人值得关注的一件事是XCodeGhost,同时也给iOS开发者对于App安全敲响了警钟。Xcode Ghost是通过Xcode注入,于2015年9月被发现。它的初始传播途径主要是通过非官方下载的 Xcode 传播,通过 CoreService 库文件进行感染。当应用开发者使用带毒的Xcode工作时,编译出的App 都将被注入病毒代码,从而产生众多带毒APP。用户在iOS设备上安装了被感染的APP后,设备在接入互联网时APP会回连恶意URL地址init.icloud-analysis.com,并向该URL上传敏感信息(如设备型号、iOS 版本)。苹果第一时间也对感染XCodeGhost的App下架,阿里工程师也针对XCodeGhost做了逆向分析,可以参考XCodeGhost逆向分析。
(六)开源项目
React NativeLearn once, write anywhere。Facebook 在 React.js Conf 2015 大会上推出了基于 JavaScript 的开源框架 React Native。React Native 结合了 Web 应用和 Native 应用的优势,可以使用 JavaScript 来开发 iOS 和 Android 原生应用。在 JavaScript 中用 React 抽象操作系统原生的 UI 组件,代替 DOM 元素来渲染等。React Native 使你能够使用基于 JavaScript 和 React 一致的开发体验在本地平台上构建世界一流的应用程序体验。React Native 把重点放在所有开发人员关心的平台的开发效率上——开发者只需学习一种语言就能轻易为任何平台高效地编写代码。Facebook 在多个应用程序产品中使用了 React Native,并将继续为 React Native 投资。
JSPatchJSPatch 只需要在项目里引入极小的引擎文件,就可以使用 JavaScript 调用任何 Objective-C 的原生接口,替换任意 Objective-C 原生方法。目前主要用于下发 JS 脚本替换原生 Objective-C 代码,实时修复线上 bug。详细的JSPatch原理可以参考。
Swift1)Kingfisher是一个异步下载和缓存图片的库,SDWebImage的Swift 实现版。2)PerfectSwift的跨平台能力值得关注,Perfect 是一个使用Swift编程语言开发Web和其他REST服务的框架,其主要目标是简化需要后端服务器软件的移动应用的开发,使开发人员可以使用同一种语言进行客户端和服务端开发。3)更多...
AFNetworking 3.0AFNetworking在3.0版本中删除了基于 NSURLConnectionAPI的所有支持。如果你的项目以前使用过这些API,建议您立即升级到基于 NSURLSession 的API的AFNetworking的版本。
YYKitYYKit 是一组庞大、功能丰富的 iOS 组件。为了尽量复用代码,这个项目中的某些组件之间有比较强的依赖关系。包含以下组件:YYModel — 高性能的 iOS JSON 模型框架。YYCache — 高性能的 iOS 缓存框架。YYImage — 功能强大的 iOS 图像框架。YYWebImage — 高性能的 iOS 异步图像加载框架。YYText — 功能强大的 iOS 富文本框架。YYKeyboardManager — iOS 键盘监听管理工具。YYDispatchQueuePool — iOS 全局并发队列管理工具。YYAsyncLayer — iOS 异步绘制与显示的工具。YYCategories — 功能丰富的 Category 类型工具库。
(七) 更多其他技术点
后面几点展开太多,也是移动开发中值得关注的永恒主题,在此就不一一列举,欢迎补充~。移动架构跨平台数据持久化App性能优化APP瘦身页面布局动效开发
参考链接:
苹果官方适配64位参考方法2015移动开发白皮书·IOS篇iOS 9/新OS X/watch OS成主角 秋季正式推出iOS 9分屏多任务iOS 9 App thinning介绍Facebook与Twitter提供的Apple tvOS SDKs支持登录与分析功能React Native 官方文档中文版jspatch平台2015是移动技术快速发展的一年,基于Apple平台的技术也发展迅速。iPhone6s/iPhone6s plus、iPad pro等新设备发布,iOS9、watchOS 2、OS X EL Capitan、tvOS等新的平台,Swift开源及Swift 2发布,React Native、JSPatch等开源社区也一片繁荣。但同时XcodeGhost等后门事件对于我们关注iOS安全也敲响了警钟。
PS:本文不是一篇技术深入的文章,只是对技术的回顾,如对某一技术点感兴趣,可详细参考对应的推荐链接。如有遗漏的地方,欢迎评论中补充~
(一)iOS App适配64位
2015年开年,让所有iOS开发者头疼的一件事就是苹果所有app自2015年2月1号起,所有提交审核的App必须适配64位,目的是能充分利用64位ARM处理器的高性能支持,让应用能够拥有更为极致的体验。(iPhone5s开始的A7处理器开始支持64位CPU)
对于App适配64位Apple也给出了方法:
Architectures支持在Xcode Building Setting中Architectures为 Standard architectures(include 64-bit)。注意:支持指令集是通过编译生成对应的二进制数据包实现的,如果支持的指令集数目有多个,就会编译出包含多个指令集代码的数据包,造成最终编译的包很大。这也是支持64位后App体积变大的主要原因。参考,ARM指令集对应的硬件ARMv8/ARM64iPhone 6s(Plus),iPhone 6(Plus), iPhone 5s, iPad Air(2), Retina iPad Mini(2,3)ARMv7siPhone 5, iPhone 5c, iPad 4ARMv7iPhone 4, iPhone 4S, iPod 3G/4G/5G, iPad, iPad 2, iPad 3, iPad Mini
数据类型导致的变化导致问题:在32位CPU和64位CPU上整型和浮点型的字结数和字节对齐的方式都不一样,从而导致App如果按照32-bit的写法去适配64位会出现很多溢出、移位等内容问题。同时适配64位可能会导致一些其它问题。1)增加内存压力。2)64位到32位数据之间的相互转化,增加了一些性能开销。3)计算可能产生不同的结果。4)当把一个值从大的数据类型拷贝到小的数据类型,数据可能被截断,如NSInteger -> int。解决办法:解决办法需要遵循数据类型的编码规范,苹果也给出了官方的建议及规范,同时也可以参考,在这里也就不详细展开,毕竟适配64位在当前应不算是问题。
方法调用导致的变化基于32-bit的CPU和基于64-bit上的CPU有不同数量的寄存器,在方法调用上有不同的协议。因此32位和64位在汇编层级上是不同的。如果我们在程序中不使用汇编,调用协议很少会遇到。
第三方库支持64位适配中其实最坑的是第三方库的支持,对于即时更新的第三方库还好(如AFNetworking,SDWebImage),但是对于一些更新较慢或者已经停止更新的Framework(如wax,作者已经停止维护),那就比较坑。当初在公司项目中,需要提前适配64位,记得当初就一直联系新浪微博SDK开发希望能够极早支持64位,我个人在公司中开发的LoginSDK组件也第一时间对64位给予了支持。
(二) WWDC 2015
WWDC 2015发布了三大平台的更新iOS 9、watch OS 2、OS X EL Capitan,同时发布了Apple Music。
iOS 9
iOS 9发布
主要更新以下亮点功能角度:1) Siri语音助手智能化,性能提升40%。2) Apple News新闻聚合App发布,但很遗憾中国内地被禁用。3) Wallet应用取代Passbook。4) iOS自带应用更新:引入Transit通勤路线功能、记事本可以云共享、carplay可自动连接、carplay可自动连接等。5) 续航优化,支持低功耗模式,平均续航能力可延长3个小时。6) 更新iOS 9剩余容量只需1.3GB,之前更新至少需要4GB以上。7)iPad引入双屏模式。
技术角度1) 3D Touch目前支持3D Touch的设备只有 iPhone 6s 和 iPhone 6s Plus。
Pressure Sensitivity:压力灵敏度,可以和绘画类及其它创作型软件结合使用,如根据压力的大小来改变笔触/画线的粗细值。主要为UITouch类增加了一些新属性,例如 estimatedProperties(触摸属性),updatedProperties(触摸对象更新)等,新增的API,主要集中在获取X/Y坐标时的精度部分,如 - PreciseLocationInView:,- PrecisePreviousLocationInView:等。需要特别注意的是UIForceTouchCapability,使用功能前,必须进行功能可用性检测。
Peek and Pop:新引入的手势,主要可以让用户预览内容,甚至进行操作。
Home Screen Quick Actions:快捷菜单,涉及API主要是:UIApplicationShortcutItem。ShortcutItem分了2种类型:静态 & 动态。其中静态方式在info.plist中进行配置;动态则通过UIApplicationShortcutItem等API进行动态配置处理。系统默认会优先展示静态的Actions。若App安装后从未打开时,则默认只会展示静态Actions。
2) SearchiOS 9中用户可以更容易搜索到他想要的内容(不管是在App还是在web上),增强了Search的功能,对应的技术点主要涉及3个API。
NSUserActivity:NSUserAcitivity在介绍 iOS8 的 Handoff 时引入,iOS9 中允许对这些 activities 进行搜索。你可以提供元数据给这些 activities, 这意味着 Spotlight 可以索引这些内容。
CoreSpotlight.framework:新增framework,提供了增、删、改、查等搜索API,可以索引App的内容。
Web Markup:Web内容可被搜索。iOS 9支持灵活的通用无缝链接(universal links介绍),用户来你的网站或直接到您的应用程序,不管你是否已经安装了App。详细可以学习Apple Develop文档。3) Multitasking
Slide Over
iOS9 Slide Over
Slide Over适用于iPad air以及iPad mini2以后的所有机型。iPad简单分屏功能,左侧原来的App占据屏幕的70%面积,右侧是30%,右侧App出来后进入活跃状态,左侧的App,所有基本活动将中断,但是并没有进入后台。
Split ViewSlide Over和Split View可以互相转换,只要用户点击一下Slide Over界面旁边的白色竖条按钮。目前Split View只支持iPad中性能最高的iPad Air 2。两个app并列呈现在屏幕上,其中左侧的app是primary app,右侧的app是secondary app。用户可以滑动两个app之间的分界线,当分界线滑倒最左侧时,secondary app将变成primary app。
iOS9 Split View Picture in picture(PiP)Pip允许你在退出App时,同时观看视频类的App,如下图所示:
Pip
Pip涉及AVKit、AV Foundation或WebKit等相关框架类的视频播放接口。1) AVKit框架提供了 AVPlayerViewController 类,它会为用户自动显示画中画按钮。如果你使用AVKit 支持PiP功能,但要退出特定的画中画视频,请将播放器视图控制器的 allowsPictureInPicturePlayback 属性设置为NO。2)AVKit还提供了 AVPictureInPictureController 类,可以和AV Foundation 框架的 AVPlayerLayer 类一同使用。如果你想为视频播放提供自己的视图控制器和自定义用户界面,可使用这个方法。3)同时WebKit框架提供了 WKWebView 类,它支持iOS 9的PiP功能。如果你使用WebKit支持PiP功能,但要退出特定视频的画中画。设定关联webView 实例的allowsPictureInPictureMediaPlayback属性为NO。
注意:如果你的App使用Media Player 框架播放视频,无论使用其框架中的MPMoviePlayerController或MPMoviePlayerViewController类,你必须迁移使用AVKit或AV Foundation。Media Player视频播放正式在iOS 9中弃用。
在iOS9中Multitasking支持一下机型:
iPad Multitasking支持机型
详细Multitasking相关技术可参考Multitasking Apple Develop文档,或者CocoaChina上的Multitasking翻译文档。
4) App thinningiOS App瘦身一直是开发者关注的问题,iOS 9推出了App thinnig,包括三部分功能:slicing、on-demand resources、bitcode。可让你的iPhone能够腾出更多的剩余空间,在应用升级过程中使用更少的数据。
slicing如下图所示:
slicing
slicing可以对应用进行分割,根据用户设备类型和屏幕分辨率的不同分发定制化下载包,开发者只需要把完整应用包的内容上传到iTunes Connect即可。
bitcodeBitcode是一个已编译程序的中间代码。如果你上传到iTunes Connect里的应用包含bitcode的话,就可以被编译和链接到App Store。加入Bitcode可以让苹果在未来对你的应用二进制文件进行再次优化,而不需要你向App Store提交新版本。注意:对于iOS,bitcode是可选的;对于watchOS,bitcode是必须的;而Mac OS是不支持bitcode。但是对于iOS App来说,如果你的App提供bitcode,那么App里的所有第三方框架都必须支持bitcode。我在公司内部开发的网易通行证LoginSDK登陆组件也第一时间支持了bitcode,在适配bitcode前请确定是否第三方库支持,否则需要寻求对应开发者的帮助。
on-demand resources开发者可以把App初始化用不到的资源分类打包上传到AppStore,在用户使用的时候系统会根据资源标签在必要的时候调用资源,当某些资源不再使用的时候会被系统自动清除。如下图所示:
on-demand resources 下载和管理按需加载资源是由操作系统完成的。app使用NSBundleResourceRequest来:a) 请求获取按需加载资源。b) 通知操作系统某些资源不再使用。c) 更新下载的优先级。d) 追踪下载的进度。e) 检查存储空间不足的通知。当已下载的某些资源不再使用时,可以用NSBundle中的方法来设置保存优先级。
详细on-demand resources介绍可以参考Apple Develop on-demand resources guide。
7) 其它a) 新增3种的App Extension Points:Network、Safari、Spotlight。b) 新增Contacts Framework,与此同时废除AddressBookUI Framework。c) Watch Connectivity,由于watchOS 2的架构变化,需要这么一个东西来对iPhone和Watch进行双向通信。d) UIKit新增,如UIStackView。e) 新增Safari Services Framework。f) 游戏方面新增了更多的Api,涉及GameplayKit、Model I/O Framework、MetalKit三方框架。g) iOS 9.1新增UITouch对Apple Pencil API的支持,详细参考。
7) 适配iOS9关于适配iOS 9就不一一展开介绍,主要涉及到以下几个点,详细可以参考Github iOS9适配详解a) 网络适配ATS:改用更安全的HTTPs。b) 更灵活的后台定位。c) 企业级分发,默认不能安装,需要在设置里点击“信任”。d) 适配Bitcode。e) URL Scheme 适配引入白名单概念,打开第三方App需要注册在URL中注册白名单。f) iOS9更改了字体,字体间隙变大导致 UI 显示异常。
8) iOS 9.2发布。
watchOS 2
watchOS 2相对于上个版本做了很多改进。watchOS 2 的主要变化跟早期的 iPhone 差不多,那就是增加了本地化的 app。苹果向开发者提供了全新的 WatchKit,也就是说从 watchOS 2 开始,应用开发者可以基于 Apple Watch 开发一些应用,应用可以通过 API 调用数码表冠、麦克风甚至 Tapic Engine 等功能,应用获取的健康数据也可以直接在 Apple Watch 上进行处理,不需要再传输到 iPhone。如下图所示:
watchOS 2架构演变
同时watchOS 2新增了ClockKit Framework,可以将你的Watch App相关信息同时显示在表的钟面上。关于watchOS 2的更多介绍可以参考Apple Develop文档
OS X EL Capitan
OS X EL Capitan
WWDC 2015同时发布了OS X EL Capitan版本。El Capitan从窗口管理、内置app和搜索等方面优化了Mac体验,并提升了性能,令启动和切换app、打开PDF文件以及访问电子邮件等日常事务都变得更加快速。关于OS X EL Capitan的技术点详细讲解也超出了本文的范围,详细可以参考Apple Develop文档。
(三)Swift
2015最让人兴奋的事之一莫过于Swift 2.0发布及Swift宣布开源,Swift社区及开源库也发展迅速。
Swift 2.0WWDC 2015发布了Swift 2.0版本,苹果针对此门语言做了很多改进及抱有很多的期望,同时承诺年底前开放Swift的源码。Swift 2.0主要引入以下新特性:1) 增加guard语句。2) 增加异常处理机制。3) 协议可扩展。4) 打印语句的语法改变。5) 增加available检查。6) do-while语句重命名。7) 增加defer关键字。详细介绍可参考。
Swift 3.03.0版本将在2016年秋天发布。Swift 3.0承诺会保持 ABI(Application Binary Interface)的稳定性:成功保持 ABI 稳定性意味着,即便源代码语言发生了变化,用以后版本的 Swift 开发的应用程序和编译库能在二进制层次上和 Swift 3.0 版本的应用程序和编译库相互调用。1)Swift API优化,废弃冗长的Objective-C式风格。2)废弃函数柯里化声明(苹果认为柯里化声明语法太过复杂)。3)废弃var形式的行参。4)废弃++ & --运算符(C语言遗留)。5.废弃for-loops(C语言遗留)
Swift开源2015年12月4号Swift宣布开源。苹果开源了Swift 三大库。1) Swift Complier & Standard Library(Swift编译器&基础库)编译器主要负责Swift的语法解析&语义分析,将Swift语言编译成高效可执行的机器代码,同时前端提供比如Swift语法高亮,代码自动补全等一些便捷的工具(想读懂这块源码要有编译器的基础知识,词法分析、语法分析......)。Swift基础库主要包括各种数据类型,如基础类型、协议、方法、集合及集合所遵循的协议和操作数据类型的基础算法。Swift的基础库底层是以Swift来实现的,更多的功能细分可以参考Swift官方博客-编译器&基础库基本介绍。2) Swift Package Manger(Swift包管理器)Swift主要是用来管理和共享Swift代码的工具,与Swift build system协调来自动处理Swift的下载,链接及依赖处理。 ( max howell 与mattt参与开发,mattt竟然跳槽去了苹果)。同时苹果官方也给出了一个 demo来教你怎样写一个Library Package,同时处理各个Packages之间的依赖(demo :example-package-dealer ,感兴趣的同学可以动手写下)。3) Swift Core Library(Swift核心库)Swift核心库提供了比基础库更高级的功能,基于 Swift 标准库。这些库提供的函数有:定位,网络,多线程,单元测试,数据持久化,文件系统访问,用户参数等功能。Swift核心库的功能将会在Swift 3.0发布,个人预计Swift 3.0将会在2016 WWDC发布。目前核心库开源了三个库Foundation、libdispatch(GCD)、XCTest(单元测试框架),这三大框架也将会随3.0发布,目前处在早期开发阶段。
(四)tvOS
tvOS
Apple TV在国内没有销售,随着近年Apple TV新品的发布,全新的第四代Apple TV 采用A8 芯片,性能更胜以往,因此开发者可为电视打造引人入胜的游戏和定制内容的 app。同时,Apple也发布了tvOS系统,该系统也是基于iOS系统,也内置了App Store。国外Netflix、HBO、Hulu等视频平台均已推出根据tvOS重新制作了对应版本的app,同时在开源社区上许多开源组件也对tvOS给予了支持。详细的tvOS开发文档参考及tvOS human-interface-guidelines如AFNetworking支持iOS, OS X, watchOS, and tvOS全平台。未来关于Apple TV在国内的销售仍然不明,不过个人对tvOS的发展还是很看好的。
(五)XCodeGhost
2015令人值得关注的一件事是XCodeGhost,同时也给iOS开发者对于App安全敲响了警钟。Xcode Ghost是通过Xcode注入,于2015年9月被发现。它的初始传播途径主要是通过非官方下载的 Xcode 传播,通过 CoreService 库文件进行感染。当应用开发者使用带毒的Xcode工作时,编译出的App 都将被注入病毒代码,从而产生众多带毒APP。用户在iOS设备上安装了被感染的APP后,设备在接入互联网时APP会回连恶意URL地址init.icloud-analysis.com,并向该URL上传敏感信息(如设备型号、iOS 版本)。苹果第一时间也对感染XCodeGhost的App下架,阿里工程师也针对XCodeGhost做了逆向分析,可以参考XCodeGhost逆向分析。
(六)开源项目
React NativeLearn once, write anywhere。Facebook 在 React.js Conf 2015 大会上推出了基于 JavaScript 的开源框架 React Native。React Native 结合了 Web 应用和 Native 应用的优势,可以使用 JavaScript 来开发 iOS 和 Android 原生应用。在 JavaScript 中用 React 抽象操作系统原生的 UI 组件,代替 DOM 元素来渲染等。React Native 使你能够使用基于 JavaScript 和 React 一致的开发体验在本地平台上构建世界一流的应用程序体验。React Native 把重点放在所有开发人员关心的平台的开发效率上——开发者只需学习一种语言就能轻易为任何平台高效地编写代码。Facebook 在多个应用程序产品中使用了 React Native,并将继续为 React Native 投资。
JSPatchJSPatch 只需要在项目里引入极小的引擎文件,就可以使用 JavaScript 调用任何 Objective-C 的原生接口,替换任意 Objective-C 原生方法。目前主要用于下发 JS 脚本替换原生 Objective-C 代码,实时修复线上 bug。详细的JSPatch原理可以参考。
Swift1)Kingfisher是一个异步下载和缓存图片的库,SDWebImage的Swift 实现版。2)PerfectSwift的跨平台能力值得关注,Perfect 是一个使用Swift编程语言开发Web和其他REST服务的框架,其主要目标是简化需要后端服务器软件的移动应用的开发,使开发人员可以使用同一种语言进行客户端和服务端开发。3)更多...
AFNetworking 3.0AFNetworking在3.0版本中删除了基于 NSURLConnectionAPI的所有支持。如果你的项目以前使用过这些API,建议您立即升级到基于 NSURLSession 的API的AFNetworking的版本。
YYKitYYKit 是一组庞大、功能丰富的 iOS 组件。为了尽量复用代码,这个项目中的某些组件之间有比较强的依赖关系。包含以下组件:YYModel — 高性能的 iOS JSON 模型框架。YYCache — 高性能的 iOS 缓存框架。YYImage — 功能强大的 iOS 图像框架。YYWebImage — 高性能的 iOS 异步图像加载框架。YYText — 功能强大的 iOS 富文本框架。YYKeyboardManager — iOS 键盘监听管理工具。YYDispatchQueuePool — iOS 全局并发队列管理工具。YYAsyncLayer — iOS 异步绘制与显示的工具。YYCategories — 功能丰富的 Category 类型工具库。
(七) 更多其他技术点
后面几点展开太多,也是移动开发中值得关注的永恒主题,在此就不一一列举,欢迎补充~。移动架构跨平台数据持久化App性能优化APP瘦身页面布局动效开发
参考链接:
苹果官方适配64位参考方法2015移动开发白皮书·IOS篇iOS 9/新OS X/watch OS成主角 秋季正式推出iOS 9分屏多任务iOS 9 App thinning介绍Facebook与Twitter提供的Apple tvOS SDKs支持登录与分析功能React Native 官方文档中文版jspatch平台

本文来源:https://www.shanpow.com/xx/445021/

《yymodel.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式

相关阅读
  • 说明文500字【四篇】 说明文500字【四篇】
  • 说明文的说明方法(合集三篇) 说明文的说明方法(合集三篇)
  • 我周围的环境作文600字初二事理说明文(通用6篇) 我周围的环境作文600字初二事理说明文(通用6篇)
  • 我周围的环境事理说明文精选七篇 我周围的环境事理说明文精选七篇
  • 中学生说明文作文汇编6篇 中学生说明文作文汇编6篇
  • 中考语文说明文阅读题及答案解析范文(通用4篇) 中考语文说明文阅读题及答案解析范文(通用4篇)
  • 部编人教版中考语文说明文阅读专题训练及答案【五篇】 部编人教版中考语文说明文阅读专题训练及答案【五篇】
  • 2022年优秀说明文范文(精选三篇) 2022年优秀说明文范文(精选三篇)
为您推荐
  • 介绍一种事物说明文范文四篇
    介绍一种事物说明文范文四篇
    介绍:介,古代传递宾主之言的人。绍,绍继、接续。介绍指相继传话;为人引进或带入新的事物。见清袁枚《随园诗话补遗》卷六:“余与和希斋大司空,全无介绍,而蒙其矜宠特隆。以下是小编整理的介绍一种事物说明文范文四篇,欢迎阅读与收藏。
  • 说明文介绍一种事物五年级作文范文四篇
    说明文介绍一种事物五年级作文范文四篇
    事物,读音shìwù,汉语词语,指客观存在于自然界的一切物体或现象。以下是为大家整理的说明文介绍一种事物五年级作文范文四篇,欢迎品鉴!
  • 说明文作文400字汇编6篇
    说明文作文400字汇编6篇
    淹溺又称溺水,是人淹没于水或其他液体介质中并受到伤害的状况。以下是小编收集整理的说明文作文400字汇编6篇,仅供参考,希望能够帮助到大家。
  • 说明文介绍一种事物范文(通用5篇)
    说明文介绍一种事物范文(通用5篇)
    介绍:介,古代传递宾主之言的人。绍,绍继、接续。介绍指相继传话;为人引进或带入新的事物。见清袁枚《随园诗话补遗》卷六:“余与和希斋大司空,全无介绍,而蒙其矜宠特隆。下面是小编为大家整理的说明文介绍一种事物范文(通用5篇),欢迎大家借鉴与参考,希望对大家有所帮助。
  • 说明文400字锦集四篇
    说明文400字锦集四篇
    电影,是由活动照相术和幻灯放映术结合发展起来的一种连续的影像画面,是一门视觉和听觉的现代艺术,也是一门可以容纳戏剧、摄影、绘画、动画、音乐、舞蹈、文字、雕塑、建筑等多种艺术的现代科技与艺术的综合体。以下是小编整理的说明文400字锦集四篇,仅供参考,大家一起来看看吧。
  • 介绍一种事物的说明文八篇
    介绍一种事物的说明文八篇
    介绍:介,古代传递宾主之言的人。绍,绍继、接续。介绍指相继传话;为人引进或带入新的事物。见清袁枚《随园诗话补遗》卷六:“余与和希斋大司空,全无介绍,而蒙其矜宠特隆。以下是小编为大家收集的介绍一种事物的说明文八篇,仅供参考,欢迎大家阅读。
  • 猫的说明文600字作文【三篇】
    猫的说明文600字作文【三篇】
    万圣节是每年的十月份的最后一天,西方的鬼节。在这个节日里,小朋友们最爱玩不请客就捣蛋的游戏。以下是小编整理的猫的说明文600字作文【三篇】,仅供参考,希望能够帮助到大家。
  • 七年级语文说明文锦集四篇
    七年级语文说明文锦集四篇
    说明文实用性很强,它包括广告、说明书、提要、提示、规则、章程、解说词等。以下是小编收集整理的七年级语文说明文锦集四篇,仅供参考,希望能够帮助到大家。
  • 介绍一种事物说明文【汇编三篇】
    介绍一种事物说明文【汇编三篇】
    介绍:介,古代传递宾主之言的人。绍,绍继、接续。介绍指相继传话;为人引进或带入新的事物。见清袁枚《随园诗话补遗》卷六:“余与和希斋大司空,全无介绍,而蒙其矜宠特隆。以下是小编收集整理的介绍一种事物说明文【汇编三篇】,仅供参考,希望能够帮助到大家。
  • 描写事物的说明文作文300字精选三篇
    描写事物的说明文作文300字精选三篇
    以下是小编整理的描写事物的说明文作文300字精选三篇,欢迎阅读与收藏。