能源文件的优化

第一,找到自个儿包裹后的ipa,然后右键,展开药格局选用归档实用工具,就能解压出来多个文书夹,在Payload文件夹中找到当前ipa的app文件(基本便是和这么些ipa名字同样的文本,app后缀系统默许遮盖),右键展现包内容,踏入到文件夹内,依照大小举办排序,你会意识装有的能源,首先对图纸张开优化,图片首要的轻重缓急应该维持到200k以内,必要动用无损压缩。图片压缩推荐应用ImageOptim

自然在变化景况用这一个私下认可的对象自然是不可信的,至少我们也要给他一个原则性的职位和名字嘛,是或不是。那那几个暗中同意对象除了读书的时候能够用下,还应该有哪些用处呢?

  • copy再次来到imutable对象;所以,假设对copy重返值使用mutable对象接口就能crash;
  • mutableCopy返回mutable对象;

分析可实施文件

  • 动用link mapXCode开启编译选项Write Link Map FileXCode -> Project
    -> Build Settings -> 搜map -> 把Write Link Map
    File选项设为yes在 编写翻译后的工程文件夹能够找到 命名为xxxlinkmapxxx.txt的文书(查找方法为,Winodw – Project – derived
    data – build - Intermediates -xxx.build –
    对应debug可能Release文件下)分析该txt文件,能够博得项目编写翻译后千家万户模块生成的.o文件在可试行文件中的组成。
  • 怎么着剖析本文选择node + js 的章程剖判。
    js代码地址
    使用方式,node js路径 xxlinkmapxxx.txt 路线 -hl 剖判出来
    过大的能够考虑收缩和替换。

用作一些测验时她正是很好的精选。

1.非集结类对象的copy与mutableCopy##\

系统非集结类对象指的是 NSString, NSNumber …
之类的指标。上面先看个非集合类immutable对象拷贝的例证

NSString *string = @"origin";NSString *stringCopy = [string copy];NSMutableString *stringMCopy = [string mutableCopy];

透过翻看内部存款和储蓄器,能够阅览 stringCopy 和 string
的地方是一样,举办了指针拷贝;而 stringMCopy 的地址和 string
不一样等,实行了剧情拷贝;

再看mutable对象拷贝例子

NSMutableString *string = [NSMutableString stringWithString: @"origin"];//copyNSString *stringCopy = [string copy];NSMutableString *mStringCopy = [string copy];NSMutableString *stringMCopy = [string mutableCopy];//change value[mStringCopy appendString:@"mm"]; //crash[string appendString:@" origion!"];[stringMCopy appendString:@"!!"];

运营以上代码,会在第7行crash,原因便是 copy 再次回到的指标是 immutable
对象。注释第7行后再运转,查看内部存款和储蓄器,发现string、stringCopy、mStringCopy、stringMCopy
四个指标的内部存款和储蓄器地址都不均等,表明此时都是做内容拷贝。

综上三个例证,大家得以得出结论:

在非集结类对象中:对immutable对象开展copy操作,是指针复制,mutableCopy操作时内容复制;对mutable对象开展copy和mutableCopy都以内容复制。用代码轻松表示如下:

  • [immutableObject copy] // 浅复制
  • [immutableObject mutableCopy] //深复制
  • [mutableObject copy] //深复制
  • [mutableObject mutableCopy] //深复制

辛苦的类型开销告以段落,未来开头优化,弄的自个儿好久没写博客了。现在首要从包的尺寸发轫优化。之后会陆陆续续从代码结构上举办优化。

那要什么样营造非暗许Realm对象啊?答案是奥迪Q7LMRealmConfiguration,通过调用:

随意是群集类对象,依然非集结类对象,接收到copy和mutableCopy音讯时,都依据以下法则:

==本文首要演说如何压缩包的轻重缓急==

在头里的稿子《Realm的CRUD》介绍了怎么最轻松易行的把Realm给用起来,并因而叁个德姆o演示了CRUD的操作。除外Realm还提供了举个例子音讯公告、调节和测量检验、数据加密等效果,大家逐一来看。

2、集合类对象的copy与mutableCopy##\

集合类对象是指NSArray、NSDictionary、NSSet …
之类的对象。上边先看集合类immutable对象使用copy和mutableCopy的八个例子:

NSArray *array = @[@[@"a", @"b"], @[@"c", @"d"];NSArray *copyArray = [array copy];NSMutableArray *mCopyArray = [array mutableCopy];

翻看内容,能够看出copyArray和array的地方是大同小异的,而mCopyArray和array的地方是差别的。表明copy操作实行了指针拷贝,mutableCopy进行了内容拷贝。但须求重申的是:此处的源委拷贝,仅仅是拷贝array那些指标,array集合内部的因素如故是指针拷贝。这和上边的非集结immutable对象的正片依旧挺相似的,那么mutable对象的拷贝会不会类似呢?大家后续往下,看mutable对象拷贝的例子:

NSMutableArray *array = [NSMutableArray arrayWithObjects:[NSMutableString stringWithString:@"a"],@"b",@"c",nil];NSArray *copyArray = [array copy];NSMutableArray *mCopyArray = [array mutableCopy];

查看内部存款和储蓄器,如作者辈所料,copyArray、mCopyArray和array的内部存款和储蓄器地址都差异,表明copyArray、mCopyArray都对array举办了剧情拷贝。同样,大家得以得出结论:

在会集类对象中,对immutable对象开展copy,是指针复制,mutableCopy是内容复制;对mutable对象实行copy和mutableCopy都以内容复制。不过:集结对象的剧情复制只限于对象自作者,对象成分仍然是指针复制。用代码轻易表示如下:

  • [immutableObject copy] // 浅复制
  • [immutableObject mutableCopy] //单层深复制
  • [mutableObject copy] //单层深复制
  • [mutableObject mutableCopy] //单层深复制

参照链接:iOS 集结的深复制与浅复制

代码部分优化

经过appcode 张开对应的工程文件 采用 Code – > inspect Code
深入分析代码,去掉无用的援引及代码。(appcode真的很强大,连拼写错误都能分析出来,不过正是长的像安卓看起来极丑)

能够协会叁个用configuration配置过后的Realm对象,其关键可配备项有:

成员 意义
fileURL 数据库文件位置
inMemoryIdentifier 如果设置的话,数据将存放在内存中并以此为标记
readOnly 是否只读
encryptionKey 如果设置的会用其作为key对数据做AES加密
schemaVersion 数据库内容的版本号
migrationBlock 如果做版本兼容的话,如果转换的逻辑block
deleteRealmIfMigrationNeeded 当数据库内容版本不兼容时是否重新创建

行为接口

除此而外用成员的不二秘诀来设置数据结构关系,Realm还为每一个途乐LMObject定义了有个别接口来约束其私下认可展现。

在用SQL描述表格的时候,大家平常会给一些字段加上”NOT
NULL”来修饰,表示其必供给有值。那年倘使达成:

+ (nonnull NSArray<NSString *> *)requiredProperties;

重返叁个分子名的数组就能够了。例如:

@implementation Student+ (NSArray *)requiredProperties { return @[@"name"];}@end

在行使SQL的时候,为了提升查询功能,平常会为一些字段增减”Index”属性,Realm也是协助那么些特点的:

+ (nonnull NSArray<NSString *> *)indexedProperties;

同等重回一分子名的数额就足以了。比方:

@implementation Student+ (NSArray *)indexedProperties { return @[@"name"];}@end

依据人名创设目录。

在使用SQL的时候,对于“NOT
NULL”的变量,常常还大概会给一个默许值,Realm通过一个字典来辅助:

+ (nullable NSDictionary *)defaultPropertyValues;

这里重返的是八个字典,字典的key为三个个属性的名字,value为那性子子的默许值。例如:

@implementation Student+ (NSDictionary *)defaultPropertyValues { return @{@"name" : @"Jim", @"age": @12};}@end

暗许的真名都以吉米而年龄都以12虚岁。

在二维表中,主键是个入眼的性质,他表示了要命字段是足以独一标识一行记录的,不可重复。Realm也是永葆这一的风味:

+ (nullable NSString *)primaryKey;

因为是主键,所以和方面不一致等,直接回到主键属性的名字,并不是三个数组。譬如:

@implementation Student+ (NSString *)primaryKey { return @"id";}@end

用id来代表各类唯一的Persion,其不足重复。

因为Realm通过贰个布局的分子来代表表中的逐一键值,不过借使中间有一部分大家并不想其录入DB如何是好吧?比方在Persion中有个能够由age推导的岁数段,这一个音讯因为和age重复不用存款和储蓄到DB中。为此Realm协助能够不托管卡宴LMObject中的部分成员:

+ (nullable NSArray<NSString *> *)ignoredProperties;

通过兑现这些函数,然后回到不要存款和储蓄的积极分子的名数组就足以了,举个例子:

@implementation Student+ (NSArray *)ignoredProperties { return @[@"ageLevel"];}#end

如此这般大家还足以自定义ageLevel的setter和getter,因为不用Realm托管,所以也就须求自个儿加上strong/weak等修饰了。

有了表格对象的定义了后,要哪些创造对象呢?最简便的格局正是和前边的德姆o中叙述的和NSObject同样每一种分子的去赋值,Realm还提供了二种个灵活的办法:来看率先种,也正是守旧的alloc+initXxx的点子

- (nonnull instancetype)initWithValue:(nonnull id)value;

用二个数组或许一个字典给每一个成员进行赋值。数组的内的成分会循序渐进成员的逐个实行赋值,而字典则会将value赋值给Key的品质。比方:

@interface Student : RLMObject@property int age;@property NSString *name;@end//  Create a Student object from a dictionaryStudent *student2 = [[Student alloc] initWithValue:@{@"name" : @"Tom", @"age" : @3}];//  Create a Student object from an arrayStudent *student3 = [[Student alloc] initWithValue:@[@"Alex", @3]];

而外上边的办法还足以通过工厂创造方法:

+ (nonnull instancetype)createInRealm:(nonnull RLMRealm *)realm withValue:(nonnull id)value;

一向在某些realm中创立那几个指标,就不要再去调用realm的add操作了,同样通过三个字典或许数组来举办早先化,要是数额库realm已经存在钦命的主键了,那么这么些方法会失利,此时得以思索用update方法,在MySQL中大家常用replace
into来达成平等的功力,比方:

repalce into t_student (`f_name`, `f_age`) values('Jim', 12) 

Realm中则用:

+ (nonnull instancetype)createOrUpdateInRealm:(nonnull RLMRealm *)realm withValue:(nonnull id)value;

具体的值同样通过字典或许数组来代表。

地方看到插入的值都是字典可能数额,那么如此想到App江西中国广播公司大的JSON由NSJSONSerialization深入分析出来是或不是中央都以数组或许字典,那那样是否足以一直管理JSON了啊?这里给一种尝试:

// A Realm Object that represents a city@interface City : RLMObject@property NSString *name;@property NSInteger cityId;// other properties left out ...@end@implementation City@end // None neededNSData *data = [@"{\\"name\\": \\"San Francisco\\", \\"cityId\\": 123}" dataUsingEncoding: NSUTF8StringEncoding];RLMRealm *realm = [RLMRealm defaultRealm];// Insert from NSData containing JSON[realm transactionWithBlock:^{ id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL]; [City createOrUpdateInRealm:realm withValue:json];}];

在前一篇中大家曾经介绍了询问获得的结果是二个近乎NSArray的器皿结构奥迪Q7LMResults。而以此结果还足以和SQL语句同样通过抬高条件来进行排序、过滤等操作。

发表评论

电子邮件地址不会被公开。 必填项已用*标注