我有一个只有静态方法的实用程序类,所以它不是从NSObject继承的(不需要对吗?)
编译时根本没有警告。
在iPhone模拟器上运行时出现问题。它崩溃并发出警告“没有实现methodSignatureForSelector: - 麻烦未来” 好吧,我喜欢“麻烦前进”的事情,我从来没有听过一个调试器告诉我那里有“前方的麻烦”。 但是我不喜欢的是错误本身......当我明确地调用静态方法时,为什么期望我在类中实现methodSignatureForSelector? (+)
谢谢! 丹尼尔
答案 0 :(得分:10)
这不是Cocoa中的惯用模式。我强烈建议你重新考虑你的设计。这不是Java或C ++。首先,甚至没有“静态方法”这样的东西 - 它们是类方法,类本身就是一个对象。
让一个不是NSObject的子类的类(“不需要”不是偏离默认行为的非常合理的理由)也是非常奇怪的,甚至更奇怪的是只有类方法的类。该类应该可以是单例,也可以是消除,并且它的方法可以转换为函数,具体取决于它是否需要保持状态。
至于你崩溃的确切原因,没有看到你的代码就很难说。这个警告本身不应该破坏你的程序。您确实需要具有+initialize
的一些实现,即使它什么也不做,因为运行时将该消息发送到接收消息的每个类。这可能是错误发生的地方 - 你发送一条消息,运行时试图发送initialize
,你的类没有响应,运行时试图调用转发机制而不能。
答案 1 :(得分:-3)
感谢您的回答!
关于'静态'与'类方法',AFAIK这只是命名,没有真正的区别。像'函数/方法'和'消息'。
但是,这不一定是'不正确'的设计。 首先你必须记住ObjC没有命名空间,所以将一些命令放入事物的唯一方法是一个类。因为如果两个函数的名称发生冲突,编译器会大声喊叫。 有时某些功能是“实用程序”功能并且可以处理其他对象,或进行某些计算,这些功能不能与某个对象直接相关来管理它们,而且它们也不应该,因为这样就会生成不必要的开销。
作为一个非常有经验的C / C ++ / Asm / Others prorgammer,当在ObjC中编程时,出于性能原因,我倾向于总是自己释放内存。 出于同样的原因,我不想在不需要的情况下产生任何开销。而且ObjC有很多开销。
文档也没有说我必须从NSObject继承,它说当我希望它被框架正确管理时我应该。
但据我所知,不需要任何管理,这些函数应该只是包含在classname命名空间内的函数。
关于+ initiallize - 只有在继承自NSObject的类时才能重写。所以最初的问题仍然存在 - 如果我不想要任何服务,我为什么要从NSObject继承呢?我不需要分配类或初始化它,因为我与它的实例无关!
ObjC中的一个奇怪的事情是你可以覆盖一个类方法吗?!