- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
ObjC具有一种非常独特的重写方法。具体来说,您可以覆盖OSX自己框架中的功能。通过“类别”或“模糊”。您甚至可以覆盖仅在内部使用的“埋藏”功能。
有人可以给我提供一个有充分理由这样做的例子吗?您会在已发布的商业软件中使用某些东西,而不仅仅是一些内部使用的黑客工具?
例如,也许您想改进某些内置方法,或者您想修复的框架方法中有一个错误。
另外,您能否解释一下为什么最好使用ObjC中的功能而不是C++ / Java等中的功能。我的意思是,我听说过可以加载C库的功能,但可以用以前加载的同名功能替换某些函数。 ObjC如何更好地修改库行为呢?
最佳答案
如果您将问题从单纯的讨论扩展到实际的库修改,那么我可以想到一些有用的示例。
从iOS 5开始,NSURLConnection
提供了 sendAsynchronousRequest:queue:completionHandler:
,这是一种块(/关闭)驱动的方式,可从可通过URL识别的任何资源(本地或远程)执行异步加载。这是一种能够继续进行的非常有用的方法,因为它使您的代码比传统的委托替代方法更干净,更小,并且更有可能使代码的相关部分彼此接近。
iOS 4中未提供该方法。因此,在我的项目中完成的工作是,在启动应用程序时(通过适当的+ (void)load
),我检查该方法是否已定义。如果没有,我会在类上修补它的实现。此后,程序的其他所有部分都可以写入iOS 5规范,而无需执行任何版本或可用性检查,就好像我只针对iOS 5,除了它也可以在iOS 4上运行。
在Java或C++中,我猜想通过创建自己的类来发布URL连接,并在每次调用时执行运行时检查,可以实现相同的目的。这是一个更糟糕的解决方案,因为要退出它更困难。这样一来,如果我决定只支持iOS 5,我只需删除添加了sendAsynchronousRequest:...
实现的源文件。没有其他改变。
至于方法混乱,我看到的唯一建议是,有人要更改现有类的功能,而又无权访问创建该类的代码。因此,您通常是在谈论通过对代码实现的假设来尝试从外部修改逻辑上不透明的代码。我不会真的支持任何语言的想法。我猜想它会在Objective-C中得到更多推荐,因为Apple更倾向于使事物变得不透明(例如,每个想要在iOS 3.1之前显示自定义相机视图的应用程序,每个想要对相机输入执行自定义处理的应用程序到iOS 4.0等),而不是因为这在Objective-C中是个好主意。不是。
编辑:因此,在进一步的说明中-我无法发布完整的代码,因为我将其编写为工作的一部分,但是我有一个名为NSURLConnectionAsyncForiOS4
的类,带有sendAsynchronousRequest:queue:completionHandler:
的实现。该实现实际上很简单,只需将操作分派到指定的队列,该队列就通过旧的sendSynchronousRequest:...
接口进行同步加载,然后将结果发布到处理程序中。
该类具有一个+ (void)load
,这是您添加到一个类的类方法,该类方法将在该类被加载到内存后立即发出,有效地作为元类的全局构造函数,并带有所有常见的警告。
在我的+load
中,我直接通过其C接口使用Objective-C运行时检查sendAsynchronousRequest:...
上是否定义了NSURLConnection
。如果不是,那么我将实现添加到NSURLConnection
,因此从此开始对其进行定义。显然,这并没有麻烦-我没有调整任何东西的现有实现,只是添加了用户提供的某些东西的实现(如果无法使用Apple的实现)。相关的运行时调用为objc_getClass
,class_getClassMethod
和class_addMethod
。
在其余的代码中,每当我想执行异步URL连接时,我都会写例如
[NSURLConnection sendAsynchronousRequest:request
queue:[self anyBackgroundOperationQueue]
completionHandler:
^(NSURLResponse *response, NSData *data, NSError *blockError)
{
if(blockError)
{
// oh dear; was it fatal?
}
if(data)
{
// hooray! You know, unless this was an HTTP request, in
// which case I should check the response code, etc.
}
/* etc */
}
NSJSONSerialization
的替代部分实现(它在运行时动态创建一个新类并将方法复制到该类);您需要进行的一项调整是,在链接时,链接器将解决对其他位置的
NSJSONSerialization
的引用,而这并不是您真正想要的。因此,我在预编译的标头中向
#define
添加了
NSJSONSerialization
的快速
NSClassFromString(@"NSJSONSerialization")
。就寻找一种暂时保持iOS 4支持的方式,而只是将项目的其余部分编写为iOS 5标准而言,这在功能上不那么整洁,但采取了类似的行动。
关于objective-c - 覆盖Objective-C框架方法是否是一个好主意?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9844309/
我遵循了一本名为“Sitepoint Full Stack Javascript with MEAN”的书中的教程,我刚刚完成了第 6 章,应该已经创建了一个带有“数据库”的“服务器”。数据库只不过是
在 Jquery 中,我创建两个数组,一个嵌入另一个数组,就像这样...... arrayOne = [{name:'a',value:1}, {name:'b',value:2}] var arra
这个问题在这里已经有了答案: What is the explanation for these bizarre JavaScript behaviours mentioned in the 'Wa
我被放在别人的代码上,有一个类用作其他组件的基础。当我尝试 ng serve --aot(或 build --prod)时,我得到以下信息。 @Component({ ...,
我正在测试一些代码,并使用数据创建了一个 json 文件。 问题是我在警报中收到“[object Object],[object Object]”。没有数据。 我做错了什么? 这是代码:
我想打印 [object Object],[object Object] 以明智地 "[[{ 'x': '1', 'y': '0' }, { 'x': '2', 'y': '1' }]]"; 在 ja
我有一个功能 View ,我正在尝试以特殊格式的方式输出。但我无法让列表功能正常工作。 我得到的唯一返回是[object Object][object Object] [object Object]
在使用优秀的 Sim.js 和 Three.js 库处理 WebGL 项目时,我偶然发现了下一个问题: 一路走来,它使用了 THREE.Ray 的下一个构造函数: var ray = new THRE
我正在使用 Material UI 进行多重选择。这是我的代码。 {listStates.map(col => (
我的代码使用ajax: $("#keyword").keyup(function() { var keyword = $("#keyword").val(); if (keyword.
我遇到了下一个错误,无法理解如何解决它。 Can't resolve all parameters for AuthenticationService: ([object Object], ?, [o
我正在尝试创建一个显示动态复选框的表单,至少应选中其中一个才能继续。我还需要获取一组选中的复选框。 这是组件的代码: import { Component, OnInit } from '@angul
我正在开发 NodeJs 应用程序,它是博客应用程序。我使用了快速验证器,我尝试在 UI 端使用快速闪存消息将帖子保存在数据库中之前使用闪存消息验证数据,我成功地将数据保存在数据库中,但在提交表单后消
我知道有些人问了同样的问题并得到了解答。我已经查看了所有这些,但仍然无法解决我的问题。我有一个 jquery snipet,它将值发送到处理程序,处理程序处理来自 JS 的值并将数据作为 JSON 数
我继承了一个非常草率的项目,我的任务是解释为什么它不好。我注意到他们在整个代码中都进行了这样的比较 (IQueryable).FirstOrDefault(x => x.Facility == fac
我只是在删除数组中的对象时偶然发现了这一点。 代码如下: friends = []; friends.push( { a: 'Nexus', b: 'Muffi
这两个代码片段有什么区别: object = nil; [object release] 对比 [object release]; object = nil; 哪个是最佳实践? 最佳答案 object
我应该为其他人将从中继承的第一个父对象传递哪个参数,哪个参数更有效 Object.create(Object.prototype) Object.create(Object) Object.creat
我在不同的对象上安排不同的选择器 [self performSelector:@selector(doSmth) withObject:objectA afterDelay:1]; [self per
NSLog(@"%p", &object); 和 NSLog(@"%p", object); 有什么区别? 两者似乎都打印出一个内存地址,但我不确定哪个是对象的实际内存地址。 最佳答案 这就是我喜欢的
我是一名优秀的程序员,十分优秀!