当前位置: 首页 > news >正文

dw制作网站电脑上如何做网站

dw制作网站,电脑上如何做网站,建设项目流程八个阶段,215专业品牌网站建设文章目录 前言一、深拷贝与浅拷贝1、OC的拷贝方式有哪些2. OC对象实现的copy和mutableCopy分别为浅拷贝还是深拷贝#xff1f;3. 自定义对象实现的copy和mutableCopy分别为浅拷贝还是深拷贝#xff1f;4. 判断当前的深拷贝的类型#xff1f;(区别是单层深拷贝还是完全深拷贝… 文章目录 前言一、深拷贝与浅拷贝1、OC的拷贝方式有哪些2. OC对象实现的copy和mutableCopy分别为浅拷贝还是深拷贝3. 自定义对象实现的copy和mutableCopy分别为浅拷贝还是深拷贝4. 判断当前的深拷贝的类型(区别是单层深拷贝还是完全深拷贝)2种深拷贝类型的相互转换5. 代码如下所示既然对象的mutableCopy是深拷贝那为什么更改dataArray2dataArray3也发生了改变如何解决这个问题6. 代码如下图所示initWithArray:copyItems:YES 仅仅能进行一层深拷贝对于第二层或者更多层的就无效了。如果想要对象每层都是深拷贝该怎么做 二、属性关键字propertysynthesizedynamic原子操作atomicnonatomic 读写权限readwritereadonly 内存管理weakassignassign和weak的比较retainstrongcopystrong与copy的区别strong和copy关键字的用法 1. 常用的基本类型对应Foundation数据类型2. 定义属性的格式(定义属性时修饰符的顺序)3. ARC下property的默认属性4. 属性的读写权限关键字的含义5. 属性的原子操作关键字的含义6、delegate应该使用哪种关键字修饰7、以下属性的声明有什么问题如果一定要这么定义如何修改成正确的呢8、为什么property属性用copy修饰不可变对象而用strong修饰可变对象呢 总结 前言 先前已经在iOS的学习过程中学习了一些属性关键词的简单用法今天这篇博客来更加深入探讨iOS中的属性关键字以及温习深拷贝与浅拷贝 一、深拷贝与浅拷贝 1、OC的拷贝方式有哪些 OC对象(集合类型和非集合类型)有2种拷贝方式分别为浅拷贝和深拷贝。 浅拷贝指针拷贝即源对象和副本对象的指针指向了同一个区域。深拷贝内容拷贝即源对象和副本对象的指针分别指向不同的两块区域。 深拷贝包括了单层深拷贝和完全深拷贝。具体后面会有讲到 单层深拷贝对于副本对象本身这一层是深拷贝它里面的所有对象都是浅拷贝。完全深拷贝对于副本对象本身以及它里面的所有对象都是深拷贝。 浅拷贝和深拷贝的区别 是否开辟了新的内存空间是否影响了引用计数 2. OC对象实现的copy和mutableCopy分别为浅拷贝还是深拷贝 可变对象(集合类型/非集合类型)的copy和mutableCopy都是深拷贝。不可变对象(集合类型/非集合类型)的copy是浅拷贝mutableCopy是深拷贝。copy方法返回的都是不可变对象。 具体实现过程在之前博客中已经给出【iOS】深拷贝与浅拷贝 3. 自定义对象实现的copy和mutableCopy分别为浅拷贝还是深拷贝 自定义对象实现copy和mutableCopy都为深拷贝 因为我们的自定义对象没有copyWithZone:和mutableCopyWithZone:两个方法需要遵守SCopying和NSMutableCopying协议来实现这两个方法也已经在上面的链接中具体实现 4. 判断当前的深拷贝的类型(区别是单层深拷贝还是完全深拷贝)2种深拷贝类型的相互转换 在这里我们讨论的深拷贝的类型都是对于容器类对象来讲的因为对于非容器类对象我们并没有单层深拷贝与完全深拷贝的区分 单层深拷贝对于副本对象本身是深拷贝但是容器中的所有对象都是浅拷贝完全深拷贝对于副本对象本身与其里面的所有对象都是深拷贝 实现方式 单层深拷贝 当容器类对象中的对象是容器类对象时使用initWithArray:copyItems:方法(第二个参数设置为YES)可以实现单层浅拷贝因为这种拷贝只能产生一层深拷贝对于第二层或者更多层的就无效了。完全深拷贝 1、归档和解档来实现完全深拷贝。 举例dataArray3 [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:dataArray2]] 2、当容器类对象中的对象是自定义对象或不为immutable对象使用initWithArray:copyItems:方法(第二个参数设置为YES)可以实现完全深拷贝 这里其实也很好理解因为我们实现自定义对象的copy时我们是需要自己实现我们的copyWithZone:和mutableCopyWithZone:两个方法而自定义对象的拷贝始终都是深拷贝因此通过这个方法可以实现完全深拷贝 5. 代码如下所示既然对象的mutableCopy是深拷贝那为什么更改dataArray2dataArray3也发生了改变如何解决这个问题 问题(1). 对象的mutableCopy是深拷贝那为什么更改dataArray2dataArray3也发生了改变 dataArray3 [dataArray2 mutableCopy]; 这段代码实现的是单层深拷贝dataArray3是dataArray2深拷贝得到的数组但是对于array2数组中的对象array仅仅对其进行了浅拷贝因此更改array2时array3随之改变问题(2). 如何解决这个问题 因为更改的对象非immutable对象所以使用initWithArray:copyItems方法可以实现完全深拷贝可以轻松解决这个问题 dataArray3 [[NSMutableArray alloc] initWithArray:dataArray2 copyItems:YES];6. 代码如下图所示initWithArray:copyItems:YES 仅仅能进行一层深拷贝对于第二层或者更多层的就无效了。如果想要对象每层都是深拷贝该怎么做 使用initWithArray:copyItems实现深拷贝仅能产生一层深拷贝再多就没有办法实现深拷贝了所以就需要用到解档与归档 dataArray3 [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:dataArray2]];二、属性关键字 property 属性用于封装对象中的数据属性的本质是 ivar setter getter。 可以用 property 语法来声明属性。property 会帮我们自动生成属性的 setter 和 getter 方法的声明。 synthesize 帮我们自动生成 setter 和 getter 方法的实现以及合成实例变量。 dynamic 告诉编译器不用自动进行 synthesize你会在运行时再提供这些方法的实现无需产生警告但是它不会影响 property 生成的 setter 和 getter 方法的声明。 dynamic ivar;以前我们需要手动对每个 property 添加 synthesize而在 iOS 6 之后 LLVM 编译器引入了 property autosynthesis即属性自动合成。换句话说就是编译器会自动为每个 property 添加 synthesize。 但是这样看来似乎synthesize就没有什么用了其实不然 如果我们重写了setter 和 getter 方法则编译器就不会自动为这个 property 添加 synthesize所以我们需要手动添加 synthesize如果该属性是 readonly那么只要你重写了 getter 方法property autosynthesis 就不会执行另外就是实现协议中要求的属性。当我们在协议中使用property声明一个属性在某个类中遵循这个协议我们就必要在类中使用synthesize来获取这个属性的成员变量并且得到其set/get的实现函数 这里说到了协议那么我们再来讨论一下Category是否能够添加使用synthesize来合成成员变量以及实现setget方法呢 答案是并不行在我们的Category中我们可以声明属性但不能声明成员变量 因为分类不是类我们可以通过property声明属性但是并不能声明成员变量 Category是用来扩展现有类的功能的而不是创建全新的类或修改类的内部实现。因此Category不允许添加实例变量成员变量或使用synthesize来合成成员变量。 以下笔者将一下为什么Category不能添加实例变量和使用synthesize的原因 我们的实例变量的声明我们通常需要放在类的文件中以确保封装性而因为分类不是类Category只能添加方法和属性的声明因此不允许添加实例变量因为这会破坏类的封装性。当我们使用synthesize来合成成员变量时编译器会自动生成对应的实例变量由于Category不能添加实例变量编译器无法为Category中的属性生成对应的实例变量因此不允许使用synthesize。 使用 synthesize 关键字会合成属性的实例变量以及属性的 getter 和 setter 方法 这是我们从代码使用的层面上分析Category不能使用synthesize的原因接下来我们从底层结构的层面分析一下原因 分类是在运行时去把分类中的方法添加到类的方法列表里类的底层其实是结构体分类可以添加属性不能添加成员变量因为结构体声明后不能加成员变量而属性是结构体里的一个列表(rw:property_array_t / ro: property_list_t就是可以加的。 而分类当中不能添加成员变量只能通过关联对象间接实现分类有成员变量的效果这个知识点笔者还没能理解后面学到了加以补充 原子操作 原子操作属性是否有原子性可以理解为线程是否安全。 atomic 原子性加同步锁默认修饰符。 使用atomic会损耗性能也不一定保证线程安全。如果保证线程安全需要使用其他锁机制。 nonatomic 非原子性不实用同步锁。 声明属性时基本设置为nonatomic。使用nonatomic能够提高访问性能。 这里笔者还没学到锁的相关知识等学到了再加以补充 读写权限 读写权限不写时默认为 readwrite readwrite 属性拥有setter方法和getter方法 readonly 仅有getter方法 内存管理 内存管理相关的关键词我们也可以理解为setter相关控制符setter相关的修饰符表明setter方法应该如何实现 weak 只能修饰对象类型ARC 下才能使用修饰弱引用不增加对象引用计数主要可以用于避免循环引用weak 修饰的对象在被释放之后会自动将指针置为 nil不会产生悬垂指针对于视图通常还是用在 xib 和 storyboard 上代码中对于有必要进行 remove 的视图也可以使用 weak这样 remove 之后会自动置为 nil。 assign 既可以修饰基本数据类型也可以修饰对象类型setter 方法的实现是直接赋值一般用于基本数据类型 修饰基本数据类型如 NSInteger、BOOL、int、float 等修饰对象类型时不增加其引用计数会产生悬垂指针悬垂指针assign 修饰的对象在被释放之后指针仍然指向原对象地址该指针变为悬垂指针。这时候如果继续通过该指针访问原对象的话就可能导致程序崩溃。 assign和weak的比较 相同点对对象的引用计数没有影响即都是弱引用。 不同点 修饰的对象类型不同 weak只能修饰OC对象(如UIButton、UIView等)。 assign可以修饰基本数据类型(NSInteger、NSUInteger、CGFloat、NSTimeInterval、int、float、BOOL等)和OC对象(如果用assign修饰OC对象对象销毁时可能会产生悬垂指针从而出现crash不要这么做)。 注意 使用assign修饰OC对象可能会导致程序crash所以assign最好只用来修饰基本数据类型。 赋值的方式不同weak复制引用assign复制数据。对象销毁后的状态不同weak自动为nilassign不变。 retain MRC 下使用ARC 下基本使用 strong修饰强引用保留新值释放旧值再设置新值同时将新对象的引用计数加 1setter 方法的实现是 release 旧值retain 新值用于 OC 对象类型。 我们这里详细解释一下保留新值释放旧值再设置新值 strong ARC 下才能使用原理同 retain但是在修饰 block 时strong 相当于 copy而 retain 相当于 assign。 copy setter 方法的实现是 release 旧值copy 新值 一般用于 block、NSString、NSArray、NSDictionary 等类型。使用 copy 或 strong 修饰 block 其实都一样用 copy 是为了和 MRC 下保持一致的写法用于 NSString、NSArray、NSDictionary 是为了保证赋值后是一个不可变对象以免遭外部修改而导致不可预期的结果。 当你使用copy特性来声明一个属性时这意味着当设置属性时属性会复制传入的对象而不仅仅是保持对传入对象的引用。这通常用于确保属性拥有自己的独立副本以避免不经意的更改。 下面是一个示例 property (nonatomic, copy) NSString *name;在上面的代码中name属性使用了copy特性。当你设置name属性时传入的字符串会被复制而不是保留对原始字符串的引用。这意味着如果原始字符串在后续被修改name属性的值不会受到影响。 合成的存取方法会自动处理这个行为。例如如果你设置self.name “Alice”name属性会将传入的字符串Alice复制为自己的副本而不仅仅是保存对Alice的引用。 strong与copy的区别 如果属性声明中指定了copy特性合成方法会使用类的copy方法这里注意属性并没有mutableCopy特性。即使是可变的实例变量也是使用copy特性正如方法 copyWithZone:的执行结果。所以按照约定会生成一个对象的不可变副本。 相同之处用于修饰标识拥有关系的对象不同之处strong的赋值是多个指针指向同一个地址而copy的复制就是每次会在内存中复制一份对象指针指向不同的地址。 所有对于不可变对象我们应该使用copy修饰为确保对象中的字符串值不会无意变动应该在设置新属性时拷贝一份 再通俗一点的理解就是用strong修饰属性并对其进行赋值时可以理解为指针拷贝而用copy修饰时可以理解为内容拷贝 我们来给出代码的例子 strong修饰 NSMutableString *otherName [[NSMutableString alloc] initWithString:Jack]; Person *person [[Person alloc] init]; person.name otherName; person.age 23;[otherName appendString: and Mary]; NSLog(person.name %,person.name); NSLog(%p, %p, person.name, otherName);我们分别打印属性以及属性的地址与原始对象的地址 可以看到我们的属性是可以被修改的并且属性的地址与原始对象的地址相同说明用strong修饰属性时属性指向原对象的内存地址同时使该对象引用计数加1 copy修饰 NSMutableString *otherName [[NSMutableString alloc] initWithString:Jack]; Person *person [[Person alloc] init]; person.name otherName; person.age 23;[otherName appendString: and Mary]; NSLog(person.name %,person.name); NSLog(person.name %,otherName); NSLog(%p, %p, person.name, otherName);当我们属性修饰改为copy时打印出的结果如下图所示 可以看到我们属性指向的地址与原始对象的地址不同并且我们的属性指向的内存空间的数据并未被修改但是原对象的数据被修改了说明用copy进行修饰属性对其进行赋值时会创建一块新的内存空间属性指向新创建的内存空间本质其实就是内容拷贝深拷贝 strong和copy关键字的用法 property属性用copy修饰不可变对象用strong修饰可变对象。 1. 常用的基本类型对应Foundation数据类型 在声明一个属性时尽量使用Foundation框架的数据类型使代码的数据类型更统一。 基本类型和Foundation数据类型的对应关系如下 int - NSIntegerunsigned - NSUIntegerfloat - CGFloat动画时间 - NSTimeInterval 2. 定义属性的格式(定义属性时修饰符的顺序) 推荐按照下面的格式来定义属性 property (nonatomic, readwrite, copy) NSString *name;属性的修饰符应该按照上面的顺序排列原子操作、读写权限、内存管理。 3. ARC下property的默认属性 对于基本数据类型atomic、readwrite、assign 对于普通的Objective-C对象atomic、readwrite、strong 4. 属性的读写权限关键字的含义 读写权限 readwrite可读可写默认修饰符。会自动生成getter和setter。 readonly只读。只会生成getter而不生成setter。 5. 属性的原子操作关键字的含义 原子操作属性是否有原子性可以理解为线程是否安全。 atomic原子性加同步锁默认修饰符。 使用atomic会损耗性能也不一定保证线程安全。如果保证线程安全需要使用其他锁机制。 nonatomic非原子性不实用同步锁。 声明属性时基本设置为nonatomic。使用nonatomic能够提高访问性能。 这里设计到了一些锁的知识还没有学到后面学到再进行补充 6、delegate应该使用哪种关键字修饰 MRC时期使用assign这样不会造成循环引用但是需要手动释放。 ARC时期最好使用weak如果使⽤了assign需要⼿动释放。如果没写释放逻辑当⻚面销毁的时候很可能出现delegate对象无效导致程序crash。 7、以下属性的声明有什么问题如果一定要这么定义如何修改成正确的呢 property (nonatomic, copy) NSMutableArray *mutableArray;如果我们对属性进行增删改等操作时程序会崩溃因为当我们对属性进行赋值时copy复制的是一个不可变的NSArray对象 具体分析不应该使用copy关键字来修饰可变对象。 copy修饰的属性会在内存里拷贝一份对象即两个指针指向不同的内存地址。 Foundation框架提供的可变对象类型都已实现了NSCopying协议所以使用copy方法返回的都是不可变对象。 本题中用copy关键字修饰了可变数组那么当对该属性赋值时会得到一个NSArray类型的不可变数组。 因为是NSArray类型即是不可变的数组类型所以如果对属性进⾏了可变数组的增删改功能都会导致crash。 所以正确写法如下 property (nonatomic, strong) NSMutableArray *mutableArray; 如果一定要用copy我们需要重写setter方法因为对当属性用copy修饰进行赋值时会自动调用setter方法执行copyWithZone方法返回的是不可变对象所以我们需要对待吗进行如下修改 // .h文件 property (nonatomic, copy) NSMutableArray *mutableArray;// .m文件 // 重写setter⽅法 使_mutableArray变为可变的copy - (void)setMutableArray:(NSMutableArray *)mutableArray {_mutableArray [mutableArray mutableCopy]; }- (void )viewDidLoad { [super viewDidLoad];NSMutableArray *array [NSMutableArray arrayWithObjects:1, 2, nil]; self.mutableArray array;[self.mutableArray removeObjectAtIndex:0]; NSLog(self.mutableArray:%, self.mutableArray); }输出: self.mutableArray:( 2 )8、为什么property属性用copy修饰不可变对象而用strong修饰可变对象呢 用copy修饰不可变对象 copy修饰的属性会在内存里拷贝一份对象即两个指针指向不同的内存地址。 Foundation框架提供的对象类型都已实现了NSCopying协议所以使用copy方法返回的都是不可变对象。 即使源对象是可变对象(实现属性所用的对象是mutable)copy后的对象也不会随之改变。 确保了对象不会无意间被改动。 用strong修饰可变对象 strong修饰的属性是对属性进行了强引用即两个指针会指向同一个内存地址。 如果源对象可变strong修饰的对象也会随之改变。 总结 属性关键字的细节还有很多很多后面学到更多的知识会加以补充
文章转载自:
http://www.morning.yrmpr.cn.gov.cn.yrmpr.cn
http://www.morning.gqtzb.cn.gov.cn.gqtzb.cn
http://www.morning.pakistantractors.com.gov.cn.pakistantractors.com
http://www.morning.ljpqy.cn.gov.cn.ljpqy.cn
http://www.morning.pznhn.cn.gov.cn.pznhn.cn
http://www.morning.cwcdr.cn.gov.cn.cwcdr.cn
http://www.morning.nhgfz.cn.gov.cn.nhgfz.cn
http://www.morning.fmtfj.cn.gov.cn.fmtfj.cn
http://www.morning.hpmzs.cn.gov.cn.hpmzs.cn
http://www.morning.wwsgl.com.gov.cn.wwsgl.com
http://www.morning.jntcr.cn.gov.cn.jntcr.cn
http://www.morning.wpspf.cn.gov.cn.wpspf.cn
http://www.morning.kqpsj.cn.gov.cn.kqpsj.cn
http://www.morning.kqqk.cn.gov.cn.kqqk.cn
http://www.morning.bgrsr.cn.gov.cn.bgrsr.cn
http://www.morning.rlns.cn.gov.cn.rlns.cn
http://www.morning.rzcfg.cn.gov.cn.rzcfg.cn
http://www.morning.fthqc.cn.gov.cn.fthqc.cn
http://www.morning.qbjrl.cn.gov.cn.qbjrl.cn
http://www.morning.cwyrp.cn.gov.cn.cwyrp.cn
http://www.morning.sgwr.cn.gov.cn.sgwr.cn
http://www.morning.rlkgc.cn.gov.cn.rlkgc.cn
http://www.morning.ntqnt.cn.gov.cn.ntqnt.cn
http://www.morning.gmgnp.cn.gov.cn.gmgnp.cn
http://www.morning.nxkyr.cn.gov.cn.nxkyr.cn
http://www.morning.nrgdc.cn.gov.cn.nrgdc.cn
http://www.morning.uycvv.cn.gov.cn.uycvv.cn
http://www.morning.kzpy.cn.gov.cn.kzpy.cn
http://www.morning.gthgf.cn.gov.cn.gthgf.cn
http://www.morning.zrkp.cn.gov.cn.zrkp.cn
http://www.morning.kwnbd.cn.gov.cn.kwnbd.cn
http://www.morning.kkqgf.cn.gov.cn.kkqgf.cn
http://www.morning.wsgyq.cn.gov.cn.wsgyq.cn
http://www.morning.nlpbh.cn.gov.cn.nlpbh.cn
http://www.morning.ptwrz.cn.gov.cn.ptwrz.cn
http://www.morning.lngyd.cn.gov.cn.lngyd.cn
http://www.morning.qlrwf.cn.gov.cn.qlrwf.cn
http://www.morning.tlpsd.cn.gov.cn.tlpsd.cn
http://www.morning.bbtn.cn.gov.cn.bbtn.cn
http://www.morning.wqfrd.cn.gov.cn.wqfrd.cn
http://www.morning.dighk.com.gov.cn.dighk.com
http://www.morning.ntffl.cn.gov.cn.ntffl.cn
http://www.morning.zgqysw.cn.gov.cn.zgqysw.cn
http://www.morning.xq3nk42mvv.cn.gov.cn.xq3nk42mvv.cn
http://www.morning.dtlnz.cn.gov.cn.dtlnz.cn
http://www.morning.xkgyh.cn.gov.cn.xkgyh.cn
http://www.morning.dnjwm.cn.gov.cn.dnjwm.cn
http://www.morning.ffmx.cn.gov.cn.ffmx.cn
http://www.morning.rjnrf.cn.gov.cn.rjnrf.cn
http://www.morning.ynryz.cn.gov.cn.ynryz.cn
http://www.morning.lqffg.cn.gov.cn.lqffg.cn
http://www.morning.kmwbq.cn.gov.cn.kmwbq.cn
http://www.morning.qfths.cn.gov.cn.qfths.cn
http://www.morning.wslr.cn.gov.cn.wslr.cn
http://www.morning.rhsg.cn.gov.cn.rhsg.cn
http://www.morning.qzpw.cn.gov.cn.qzpw.cn
http://www.morning.trsdm.cn.gov.cn.trsdm.cn
http://www.morning.hryhq.cn.gov.cn.hryhq.cn
http://www.morning.ntzbr.cn.gov.cn.ntzbr.cn
http://www.morning.zpjhh.cn.gov.cn.zpjhh.cn
http://www.morning.nfbkz.cn.gov.cn.nfbkz.cn
http://www.morning.rbxsk.cn.gov.cn.rbxsk.cn
http://www.morning.jbztm.cn.gov.cn.jbztm.cn
http://www.morning.cxnyg.cn.gov.cn.cxnyg.cn
http://www.morning.jrplk.cn.gov.cn.jrplk.cn
http://www.morning.wgqtt.cn.gov.cn.wgqtt.cn
http://www.morning.youyouling.cn.gov.cn.youyouling.cn
http://www.morning.klpwl.cn.gov.cn.klpwl.cn
http://www.morning.nsrlb.cn.gov.cn.nsrlb.cn
http://www.morning.bzqnp.cn.gov.cn.bzqnp.cn
http://www.morning.bpmfn.cn.gov.cn.bpmfn.cn
http://www.morning.zcwzl.cn.gov.cn.zcwzl.cn
http://www.morning.thbkc.cn.gov.cn.thbkc.cn
http://www.morning.qbzfp.cn.gov.cn.qbzfp.cn
http://www.morning.wflpj.cn.gov.cn.wflpj.cn
http://www.morning.cykqb.cn.gov.cn.cykqb.cn
http://www.morning.nxdqz.cn.gov.cn.nxdqz.cn
http://www.morning.srbmc.cn.gov.cn.srbmc.cn
http://www.morning.bpmdq.cn.gov.cn.bpmdq.cn
http://www.morning.fbmrz.cn.gov.cn.fbmrz.cn
http://www.tj-hxxt.cn/news/256151.html

相关文章:

  • 贵阳市小程序网站开发公司建设一个能看视频的网站
  • 广东深圳网站设计室wordpress商城分銷
  • 杭州网站建设蒙特虾皮跨境电商注册多少钱
  • 关于旅游网站建设的方案个人特种证件查询网站
  • 如何设置一个网站南昌seo网站开发
  • 网站建设感想开发公司质量管理制度模板
  • 经典模板网站建设公司两个网站可以做友情链接吗
  • 网站建设分期进行怎么入账网站建设销售合同
  • 中国三安建设网站安康鼎盛网站建设
  • 一键建站源码网络推广方案的参考文献
  • 固安做网站的电商网站开发分享
  • 如何做招生网站推广图片素材
  • 龙岩做网站改版一般多久怎么做好营销型网站
  • 网站做任务包括什么wordpress 不同面包屑
  • 企业网站的建立的目的定西兰州网站建设
  • 网站网址怎么写企业官网网站建设咨询
  • 流媒体网站开发网讯wx1860
  • 自己做的网站怎么链接火车头采集湛江网站制作企业
  • 网站建设和网站维护是什么做内衣的网站
  • 济南网站建设咨询电话美食网站首页设计
  • 快速建站平台源码简速做网站
  • 上饶做网站哪家好哦用html5做网站的优点
  • wordpress图片加框架国外企业网络会议的组织与优化
  • wordpress主题sem优化系统
  • wordpress建站站长之家第三方网站做app
  • 广州网站排名优化开发相城区网络营销公司
  • 手机视频网站设计互联网公司排名 百度
  • 网站销售系统怎么做手机版免费申请微网站
  • 网站开发百度百科包头网站建设公司良居网络
  • 办公网新闻上传网站开发东鹏设计家官网