ios中的设计模式之class Clusters

本文探讨了ClassClusters设计模式在iOS开发中的应用,通过NSString的例子解释了不同子类的作用及其实现原理。并讨论了ClassClusters如何帮助简化代码、提高性能。

http://www.cocoachina.com/applenews/devnews/2014/0530/8622.html



我对设计模式一直都是一个若有若无的感觉,特别是在手机端开发,觉得用处不是很大,认为设计模式是为了大规模团队合作,分工才能体现出效果。设计模式可以通过分不同的“层”让大家协同开发,相互之间不产生影响。但是最近看法有点改变,觉得还是需要多少了解一些。
 
天天使用的framework确实是一个庞大的项目,从framework的设计中可以找到很多设计模式的影子,而且还是一个很好的生产化的例子。这里先介绍 Class Clusters
 
Class Clusters 几乎涉及到iOS日常的所有开发过程中,也可能正是这样,导致我们很容易把它彻底遗忘。这里就拿最常用的 NSString 来讲。
 
  1. NSString *string1 = @"helloworld"
  2. NSString *string2 = [[NSString alloc] initWithFormat:@":%@", @"helloworld"]; 
  3. NSString *string3 = [NSHomeDirectory() stringByAppendingPathComponent:string1]; 
  4. NSTextStorage *storage = [[NSTextStorage alloc] initWithString:string1]; 
  5. NSString *string4 = [storage string]; 
  6.   
  7. NSLog(@"%@", [[string1 class] description]); 
  8. NSLog(@"%@", [[string2 class] description]); 
  9. NSLog(@"%@", [[string3 class] description]); 
  10. NSLog(@"%@", [[string4 class] description]); 
 
不知道有多少人试过哈,string3的返回还是让我吃了一惊。下面的结果是在Xcode5.1 SDK7.1 下的结果。
 
  1. _NSCFConstantString 
  2. _NSCFString 
  3. NSPathStore2 
  4. NSBigMutableString 
 
通过上面的方法创建的 NSString 最后都产生了不同的子类。有人可能会奇怪为什么需要不同的 NSString。因为对于大部分的以阅读内容为主的App来讲,很大部分资源消耗在了字符串处理上面(存储,解析,比较等等),所以对于字符串的存储需要有不同的方式来满足不同的情况,这样才能有性能上的提高。
 
Note: 设想一下,在这些场景上面,如果Apple直接把这些类扔给开发者,会有什么问题呢?那么开发者需要自己在不同的场景决定使用不同的子类,不仅学习成本提高,而且也容易生成性能不太好的代码。现在简单的 NSString 就可以直接覆盖上面的所有场景。而且随着iOS的软硬件的后续开发,开发者还可以在不修改代码的情况下获得性能提升。
 
既然看到了它的强大之处,那么就开始了解吧。 既然这是第一篇DesignPattern那么就从最简单开始:
 
Abstract Classes 
这里引用一下Mike的内容
 An abstract class is a class which is not fully functional on its own. It must be subclassed, and the subclass must fill out the missing functionality.
 
An abstract class is not necessarily an empty shell. It can still contain a lot of functionality all on its own, but it’s not complete without a subclass to fill in the holes.
 
Mike Ash Friday Q&A 2010-03-12: Subclassing Class Clusters
 
Abstract Class 的概念很简单,类中所有的方法不需要全部有具体的实现,相当于定义了很多的接口。比如一开始的 NSString
 
Class Clusters 
 A class cluster is a hierarchy of classes capped off by a public abstract class. The public class provides an interface and a lot of auxiliary functionality, and then core functionality is implemented by private subclasses. The public class then provides creation methods which return instances of the private subclasses, so that the public class can be used without knowledge of those subclasses.
 
Mike Ash Friday Q&A 2010-03-12: Subclassing Class Clusters
 
Clusters的角色不仅要实现 Abstract Class 的方法,还需要自己实现自己的特殊化需求。Abstract Class 负责提供一个“外壳”,真正“干活”的就是Cluster class。这样外部就只需要了解Abstract Class就可以了。
 
NSString Benefits
比如 _NSCFConstantString 负责 const string,类似 @”helloworld”这样的字符串。这样的字符串有一个特点,不会被修改,当真正处理的时候,可以分配大小合适的内存,甚至可以分配在只读 data segment上面,而不需要分配在堆上面,如果有相同的字符串引用就可以完全赋值相同的地址。那么在retainCount上面的处理也就和其他字符串处理有很大不同。
 
NSPathStore2 看上去是处理有Path相关的字符串,因为没有源代码,这里我们可以大胆猜测一下,path相关的主要是做字符串的拼接操作,而这些字符串通常很长,占用空间大,但是重复的概率缺很高,那么就可以缓存一些字符串,这样可以减少一些内存的分配释放开销。
 
How to use 
The class cluster architecture involves a trade-off between simplicity and extensibility: Having a few public classes stand in for a multitude of private ones makes it easier to learn and use the classes in a framework but somewhat harder to create subclasses within any of the clusters.
 
Apple Develpoer Document Cocoa Core Competencies
 
就像Apple文档中提到的,Class Cluster 是在简单和扩展性上面做了一个妥协。Class Clusters 的子类化比较麻烦,而且也看上去也非常trick,Apple 更推荐的方法是用组合的方法来扩展。
 
大家都知道设计模式有一个非常重的坑就是被过渡设计。Class Cluster 可以帮我们
1. 减少了if else 这样缺乏扩展性的代码
2. 增加新功能支持不影响其他代码
 
那么这个非常适合应用在适配上面,比如不同屏幕的适配,不同厂家可能的不同的需求。
 
  1. + (id)alloc { 
  2.     if ([self class] == [SFSSearchTVC class]) { 
  3.         if ([UIDevice currentDevice] systemMajorVersion] < 7) { 
  4.             return [SFSSearchTVC6 alloc]; 
  5.         } else if ([UIDevice currentDevice] systemMajorVersion] == 7) { 
  6.             return [SFSSearchTVC7 alloc]; 
  7.         } 
  8.     } 
  9.   
  10.     return [super alloc]; 
 
上面是代码来自BJ Miller’s blog  《 A Cluster to Remove Clutter》 是用于适配iOS6,iOS7的简单例子。
 
Conclusion
很多设计模式都很像,也很容易糊涂,比如工厂模式和Class Clusters在某些地方就很类似,我自己也并不能很好的分清楚。 设计模式的本质是为了解耦。不管使用哪个设计模式,我们最后追求的都是简单、容易维护和扩展的代码。

## 软件功能详细介绍 1. **文本片段管理**:可以添加、编辑、删除常用文本片段,方便快速调用 2. **分组管理**:支持创建多个分组,不同类型的文本片段可以分类存储 3. **热键绑定**:为每个文本片段绑定自定义热键,实现一键粘贴 4. **窗口置顶**:支持窗口置顶功能,方便在其他应用程序上直接使用 5. **自动隐藏**:可以设置自动隐藏,减少桌面占用空间 6. **数据持久化**:所有配置和文本片段会自动保存,下次启动时自动加载 ## 软件使用技巧说明 1. **快速添加文本**:在文本输入框中输入内容后,点击"添加内容"按钮即可快速添加 2. **批量管理**:可以同时编辑多个文本片段,提高管理效率 3. **热键冲突处理**:如果设置的热键与系统或其他软件冲突,会自动提示 4. **分组切换**:使用分组按钮可以快速切换不同类别的文本片段 5. **文本格式化**:支持在文本片段中使用换行符和制表符等格式 ## 软件操作方法指南 1. **启动软件**:双击"大飞哥软件自习室——快捷粘贴工具.exe"文件即可启动 2. **添加文本片段**: - 在主界面的文本输入框中输入要保存的内容 - 点击"添加内容"按钮 - 在弹出的对话框中设置热键和分组 - 点击"确定"保存 3. **使用热键粘贴**: - 确保软件处于运行状态 - 在需要粘贴的位置按下设置的热键 - 文本片段会自动粘贴到当前位置 4. **编辑文本片段**: - 选中要编辑的文本片段 - 点击"编辑"按钮 - 修改内容或热键设置 - 点击"确定"保存修改 5. **删除文本片段**: - 选中要删除的文本片段 - 点击"删除"按钮 - 在确认对话框中点击"确定"即可删除
<think>好的,我现在要解决的问题是用户在使用Jupyter Notebook时,菜单栏中没有找到“Clusters”和“Conda”选项。首先,我需要回忆一下Jupyter Notebook的界面和常见配置,然后分析可能的原因,再逐步给出解决方案。 首先,用户提到的“Clusters”和“Conda”可能指的是什么?Clusters通常与并行计算或分布式计算相关,可能涉及到IPython Parallel这个库,它允许用户在多个进程或机器上运行代码。而Conda是一个包管理和环境管理工具,通常在Anaconda或Miniconda发行版中使用。在Jupyter Notebook中,用户可能期望通过菜单直接访问这些功能。 接下来,我需要考虑为什么这些选项不在菜单栏中。可能的原因有几个: 1. **未安装相关插件或扩展**:Jupyter Notebook的功能可以通过安装扩展来增强。例如,Conda可能需要安装nb_conda这样的扩展才能在界面中显示环境管理选项。同样,Clusters可能需要IPython Parallel和相关扩展的支持。 2. **版本问题**:用户可能使用的Jupyter Notebook版本较旧,某些功能在新版本中已被移除或调整。需要确认当前版本是否支持这些功能,或者是否需要升级。 3. **安装方式问题**:如果用户是通过不同的渠道安装的Jupyter Notebook(比如使用pip而不是conda),可能会缺少与Conda集成的部分组件,导致菜单选项不显示。 针对这些可能性,我需要逐步指导用户检查安装情况,安装必要的扩展,并确认配置是否正确。 首先,关于Conda的集成。用户如果希望直接在Jupyter Notebook中管理Conda环境,需要安装nb_conda包。这个包提供了Conda环境和包的集成。用户可以通过conda命令安装: $$ conda install nb_conda $$ 安装后,重启Jupyter Notebook,应该能在菜单栏的“Conda”标签下看到环境管理选项。如果用户已经安装了nb_conda但仍然看不到,可能需要检查是否安装正确,或者是否有冲突的包存在。 其次,关于Clusters选项。Clusters通常由IPython Parallel提供,需要安装ipyparallel包。安装后,用户需要初始化IPython Parallel的配置,并启动控制器和引擎。安装命令: $$ conda install ipyparallel $$ 或者使用pip: $$ pip install ipyparallel $$ 安装完成后,需要运行以下命令启用IPython Parallel的Jupyter扩展: $$ ipcluster nbextension enable $$ 然后,在Jupyter Notebook中应该能看到Clusters选项卡。如果仍然不显示,可能需要手动启动集群或检查扩展是否正确启用。 另外,用户需要确认是否在正确的环境中安装了这些扩展。如果用户使用多个Conda环境,可能需要在特定的环境中安装这些包,并在该环境中启动Jupyter Notebook。 总结解决步骤: 1. 检查是否安装了nb_conda和ipyparallel。 2. 确认安装后重启Jupyter Notebook。 3. 确保Jupyter Notebook运行在安装了扩展的环境中。 4. 如有必要,手动启用扩展或启动集群。 如果用户按照以上步骤操作后仍然无法看到相关选项,可能需要进一步检查日志文件或重新安装相关包。此外,也可以考虑使用Jupyter Lab,它可能提供更现代的界面和更好的扩展管理。</think>在Jupyter Notebook中找不到**Clusters**和**Conda**菜单选项,通常是因为缺少相关插件或配置。以下是逐步解决方案: --- ### 一、关于**Conda菜单消失** 1. **原因** Conda环境管理功能由`nb_conda`插件提供,未安装时菜单不会显示。 2. **解决方法** 通过以下命令安装插件: ```bash conda install nb_conda -c conda-forge ``` - 安装后**重启Jupyter Notebook**,菜单栏会出现`Conda`标签,支持环境切换和包管理。 3. **验证** - 输入`conda list`检查是否包含`nb_conda` - 确保Jupyter Notebook在Conda基础环境中启动(或目标环境已安装该插件) --- ### 二、关于**Clusters(集群)选项缺失** 1. **原因** Clusters功能依赖`ipyparallel`库,用于并行计算。未安装时不会显示。 2. **解决方法** **步骤1:安装ipyparallel** ```bash conda install ipyparallel -c conda-forge ``` 或使用pip: ```bash pip install ipyparallel ``` **步骤2:启用Jupyter扩展** ```bash jupyter serverextension enable --py ipyparallel jupyter nbextension install --py ipyparallel jupyter nbextension enable --py ipyparallel ``` **步骤3:启动集群控制器** ```bash ipcluster start # 默认启动4个引擎 ``` - 重启Jupyter Notebook后,菜单栏会显示`Clusters`标签。 --- ### 三、其他可能问题 1. **Jupyter版本过旧** 更新Jupyter及相关组件: ```bash conda update jupyter nb_conda ipyparallel ``` 2. **扩展冲突** 禁用其他冲突的扩展,例如: ```bash jupyter nbextension disable <冲突扩展名> ``` 3. **检查运行环境** - 确保在安装了插件的Conda环境中启动Jupyter Notebook: ```bash conda activate 你的环境名 jupyter notebook ``` --- ### 四、替代方案(使用Jupyter Lab) 如果问题持续,可尝试迁移到**Jupyter Lab**(更现代的界面): 1. 安装Jupyter Lab: ```bash conda install jupyterlab -c conda-forge ``` 2. 安装Lab版Conda插件: ```bash conda install jupyterlab_conda -c conda-forge ``` --- 通过以上步骤,**Conda**和**Clusters**菜单应正常显示。如果仍存在问题,可检查终端日志或尝试重新创建Conda环境。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值