第25条:总是为第三方类的分类名称加前缀

CHM CHM     2022-09-11     665

关键词:

  本条要点:(作者总结)

 

 

  分类机制通常用于向无源码的既有类中新增功能。这个特性极为强大,但在使用时也很容易忽视其中可能产生的问题。这个问题在于:分类中的方法是直接添加在类里面的。它们就好比这个类中的固有方法。将分类方法加入类中这一操作是在运行期系统加载分类时完成的。运行期系统会把分类中所实现的每个方法都加入类的方法列表中。如果类中本来就有此方法,而分类又实现了一次,那么分类中的方法会覆盖原来那一份实现代码。实际上可能会发生很多次覆盖,比如某个分类中的方法覆盖了 “主实现” 中的相关方法,而另外一个分类中的方法又覆盖了这个分类中的方法。多次覆盖的结果以最后一个分类为准。

  比方说,要给NSString 添加分类,并在其中提供一些辅助方法,用于处理与 HTTP URL 有关的字符串。你可能会把分类写成这样:

1 @interface NSString (HTTP)
2 
3 // Encode a string with URL encoding
4 - (NSString *)urlEncodedString;
5 
6 // Decode a URL encoded string
7 - (NSString *)urlDecodedString;
8 
9 @end

  现在看起来没什么问题,可是,如果还有一个分类也往 NSString 里面添加方法,那会如何呢?那个分类里可能也有个名叫 urlEncodedString 的方法,其代码与你所添加的大同小异,但却不能正确实现你所需的功能。那个分类的加载时机如果晚于你所写的这个分类,那么其代码就会把你的那一份覆盖掉,这样的话,你在代码中调用 urlEncodedString 方法时,实际执行的是那个分类里的实现代码。由于其执行结果和你预期的值不同,所以自己所写的那些代码也许就无法正常运行了。这种bug 很难追查,因为你可能意识不到实际执行的 urlEncodedString 代码并不是自己实现的那一份。

  要解决此问题。一般的做法是: 以命名空间来区别各个分类的名称与其中所定义的方法。想在 Objective-C 中实现命名空间功能,只有一个办法,就是给相关名称都加上某个共用的前缀。与类名加前缀时所应考虑的因素相似

echarts折线图第二条折线的值总是第一条折线加第二条折线的和,怎么设置为不是这样

使用EXCEL绘制折线图,为了表现两条折线的差经常会需要将两条折线之间的面积填充颜色,那么怎么实现这一效果呢?直接使用折线图,没有办法实现这一功能,但是通过面积图,只要稍微做些设置,就可以实现这一效果,如下... 查看详情

使用全局变量,当多个线程同时修改静态属性第三季

...部变量”两种:  1.全局变量(globalvariable),比如类的静态属性(加static关键字),在类的整个生命周期都有效;  2.局部变量(localvariable),比如在一个方法中定义的变量,作用域只是在当前方法内,方法执行完毕后,... 查看详情

破译密码(代码片段)

...01密码,求对于每条密码,有多少条信息与他的最长公共前缀=min(密码长度,该条信息长度),1<=N,M<=50000,其长度均小于等于10000输入的总长度<=500000Input第1行输入N和M之后N行描述秘密信息,之后M行描述密码.每行先输入一个... 查看详情

Xcode 6 中的 iCloud 容器名称前缀更改

】Xcode6中的iCloud容器名称前缀更改【英文标题】:iCloudContainernameprefixchangeinXcode6【发布时间】:2015-01-1901:50:25【问题描述】:我需要更新我的iCloud容器名称前缀为TeamIDPrefix的实时应用之一。Xcode6只允许以iCloud开头的iCloud容器名称... 查看详情

c++类里成员变量为什么加前缀m_?(避免成员变量与传入参数名称冲突)

为了避免成员变量与传入参数名称冲突其中有两种常用解决办法,比如成员变量命名为m_argument,传入参数为argument,m_argument=argument;或者成员变量命名为argument_,传入参数为argument,argument_=argument参... 查看详情

c++类里成员变量为什么加前缀m_?(避免成员变量与传入参数名称冲突)

为了避免成员变量与传入参数名称冲突其中有两种常用解决办法,比如成员变量命名为m_argument,传入参数为argument,m_argument=argument;或者成员变量命名为argument_,传入参数为argument,argument_=argument参... 查看详情

运行第二个单元测试时核心数据实体名称为零

...我正在尝试为我的核心数据代码添加一些单元测试。但我总是有这个问题,第一个测试总是正确运行,但第二个测试崩溃,因为实体名称为零。我也收到此错误:MultipleNSEntityDescriptionsclaimtheNSM 查看详情

淘淘商城第三天笔记

第三天笔记1课程计划后台管理商品的添加功能1、商品分类选择2、上传图片3、富文本编辑器(kindEditor)4、实现商品的添加5、课后作业(商品的修改、删除)2商品添加功能说明3类目选择3.1需求点击类目选择按钮弹出类目选择窗... 查看详情

GridSearchCV 意外行为(总是返回第一个参数为最佳)

】GridSearchCV意外行为(总是返回第一个参数为最佳)【英文标题】:GridSearchCVunexpectedbehaviour(alwaysreturnsthefirstparameterasthebest)【发布时间】:2021-12-1815:05:47【问题描述】:我有一个多类分类问题,我需要找到最佳参数。我无法更改... 查看详情

怎么去掉wordpress分类和标签前缀

  去掉wordpress分类(category)和标签(tag)前缀方法有三种:  方法一:通过直接在wordpress后台修改固定链接设置去掉分类和标签链接中前缀  首先登录WordPress后台,打开固定链接设置项,分别在“分类目录前缀”、“标签... 查看详情

出售金鱼(代码片段)

一、问题描述小明将养的一缸金鱼分5次出售:第1次卖出全部的一半加1/2条;第2次卖出余下的三分之一加1/3条;第3次卖出余下的四分之一加1/4条;第4次卖出余下的五分之一加1/5条;最后卖出余下的11条。试编程求出原来鱼缸中... 查看详情

从搅拌机中导出网格总是具有相同的名称

】从搅拌机中导出网格总是具有相同的名称【英文标题】:exportingameshfromblenderalwayswiththesamename【发布时间】:2012-08-2823:54:38【问题描述】:我正在为Blender编写导出器,但遇到了一个小问题-当我多次导出同一个模型时,导出的网... 查看详情

ip地址分类

...的特征:当将IP地址写成二进制形式时,A类地址的第一位总是0,B类地址的前两位总是10,C类地址的前三位总是110。A类地址1.0.0.0--126.0.0.0(1)第1字节为网络地址,其它3个字节为主机地址,第1个字节的第一位固定为0。(2)10.X.X... 查看详情

mysql如何批量导入含有大量html的csv,csv是一个产品表,包含1000条产品,每

...其他相同的,如果相同会覆盖掉(必填);_category:产品分类,如果产品属于一级的,则填写分类名称,比如分类名称为:Jewelry,那直接填写Jewelry即可,如果产品属于第二级的,则填写为:Jewelry/subcate(也就是把一级和二级的分... 查看详情

file类的基本使用(代码片段)

java.io类Filejava.lang.Objectjava.io.File所有已实现的接口:Serializable,Comparable<File> publicclassFile extendsObjectimplementsSerializable,Comparable<File>文件和目录路径名的抽象表示形式。用户界面和操作系统使用与系统相关的路径名字... 查看详情

组前缀内的路由名称不包括前缀

】组前缀内的路由名称不包括前缀【英文标题】:routenamesinsideagroupprefixdoesnotincludetheprefix【发布时间】:2020-06-2419:29:25【问题描述】:我有这些路线:Route::group([\'middleware\'=>[\'role:admin\'],\'prefix\'=>\'admin\'],function()Route::resource(... 查看详情

使用asp.netmvc配置路由操作教程

...oduct/123,而不是原来的/product/details/1234、还可以配置带有分类参数的路由,使得访问路径可以变成:/product/food或/product/food/2,前者表示food分类下的所有商品,后者表示food分类下编号为2的商品5、还可以对分类名进行限制,只允... 查看详情

@csp模拟2019.10.16-t3@垃圾分类(代码片段)

...到另一个垃圾桶。垃圾投放点是编号为r的垃圾桶,垃圾总是投放在这里。垃圾共有n种,编号也是1,2,...,n。编号为i的垃圾会被输送到编号为i的垃圾桶里面,垃圾总是自动沿着最短路线输送,到达编号为i的垃圾桶后需要ai秒才能... 查看详情