- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我有兴趣了解导致开发人员覆盖 +initialize 或 +load 的情况。文档清楚地说明了这些方法是由 Objective-C 运行时为您调用的,但是从这些方法的文档中可以清楚地看到这些。 :-)
我的好奇心来自于查看 Apple 的示例代码 - MVCNetworking。他们的模型类有一个 +(void) applicationStartup
方法。它在文件系统上做一些内务处理,读取 NSDefaults 等等……并且在尝试了解 NSObject 的类方法之后,看起来这项清洁工作可能可以放入 +load 中。
我确实修改了 MVCNetworking 项目,删除了 App Delegate 中对 +applicationStartup 的调用,并将管理位放入 +load... 我的计算机没有着火,但这并不意味着它是正确的!我希望了解您必须调用的自定义设置方法与 +load 或 +initialize 的任何微妙之处、陷阱和诸如此类的东西。
对于 +load 文档说:
The load message is sent to classes and categories that are both dynamically loaded and statically linked, but only if the newly loaded class or category implements a method that can respond.
如果你不知道所有单词的确切含义,这句话很杂乱,很难解析。救命!
“动态加载和静态链接”是什么意思?可以动态加载和静态链接,还是它们相互排斥?
"...新加载的类或类别实现了一个可以响应的方法"什么方法?如何回应?
至于 +initialize,文档说:
initialize it is invoked only once per class. If you want to perform independent initialization for the class and for categories of the class, you should implement load methods.
我的意思是,“如果你试图设置类......不要使用初始化。”好的。那么我何时或为什么要覆盖初始化?
最佳答案
加载
消息运行时将load
消息发送到每个类对象,在类对象加载到进程的地址空间后不久。对于作为程序可执行文件一部分的类,运行时会在进程生命周期的早期发送 load
消息。对于共享(动态加载)库中的类,运行时会在共享库加载到进程的地址空间后立即发送加载消息。
此外,如果类对象本身实现了 load
方法,则运行时仅将 load
发送到该类对象。示例:
@interface Superclass : NSObject
@end
@interface Subclass : Superclass
@end
@implementation Superclass
+ (void)load {
NSLog(@"in Superclass load");
}
@end
@implementation Subclass
// ... load not implemented in this class
@end
运行时将 load
消息发送到 Superclass
类对象。它确实不将 load
消息发送到 Subclass
类对象,即使 Subclass
从 继承方法>父类(super class)
.
运行时将 load
消息发送到类的所有父类(super class)对象(如果这些父类(super class)对象实现 load
) 以及您链接到的共享库中的所有类对象。但是您还不知道您自己的可执行文件中的哪些其他类已收到 load
。
如果你的进程加载到它的地址空间中的每个类都将收到一个 load
消息,如果它实现了 load
方法,无论你的进程是否有任何其他用途类(class)。
您可以在 objc-runtime-new.mm
的 _class_getLoadMethod
中看到运行时如何将 load
方法作为特例查找。 , 并直接从 objc-loadmethod.mm
中的 call_class_loads
调用它.
运行时还运行它加载的每个类别的 load
方法,即使同一类上的多个类别实现 load
。这是不寻常的。通常,如果两个类别在同一个类上定义了相同的方法,则其中一个方法将“获胜”并被使用,而另一个方法将永远不会被调用。
初始化
方法运行时在向类发送第一条消息(load
或 initialize
除外)之前调用类对象的 initialize
方法对象或类的任何实例。该消息是使用正常机制发送的,因此如果您的类没有实现 initialize
,而是从一个实现的类继承,那么您的类将使用其父类(super class)的 initialize
。运行时将首先将 initialize
发送到类的所有父类(super class)(如果尚未发送父类(super class) initialize
)。
例子:
@interface Superclass : NSObject
@end
@interface Subclass : Superclass
@end
@implementation Superclass
+ (void)initialize {
NSLog(@"in Superclass initialize; self = %@", self);
}
@end
@implementation Subclass
// ... initialize not implemented in this class
@end
int main(int argc, char *argv[]) {
@autoreleasepool {
Subclass *object = [[Subclass alloc] init];
}
return 0;
}
这个程序打印两行输出:
2012-11-10 16:18:38.984 testApp[7498:c07] in Superclass initialize; self = Superclass
2012-11-10 16:18:38.987 testApp[7498:c07] in Superclass initialize; self = Subclass
由于系统延迟发送 initialize
方法,除非您的程序实际向类(或子类,或类或子类的实例)发送消息,否则类不会收到消息。当您收到 initialize
时,您进程中的每个类都应该已经收到 load
(如果合适的话)。
实现initialize
的规范方式是这样的:
@implementation Someclass
+ (void)initialize {
if (self == [Someclass class]) {
// do whatever
}
}
这种模式的重点是避免 Someclass
在其子类没有实现 initialize
时重新初始化自身。
运行时在objc-initialize.mm
中的_class_initialize
函数中发送initialize
消息.可以看到它使用objc_msgSend
来发送,就是正常的消息发送功能。
查看 Mike Ash's Friday Q&A关于这个话题。
关于objective-c - NSObject +load 和 +initialize - 他们做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13326435/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!