我试图在Objective-C类和Java和Ruby中的功能之间绘制相似之处。请看看这些结论是否准确 -
Objective-C Category即使您无法访问该类的源代码,也会向现有类添加新方法。 Java没有类似的东西,但在Ruby中你可以“打开”任何类,包括像String这样的核心语言类。
class String
def my_new_method
"new test method"
end
end
"some string".my_new_method
=> "new test method"
类似地,在Objective-C中,您可以使用类别“重新打开”NSString类。
#import "NSString+ForTest.h"
@implementation NSString (ForTest)
-(NSString*) myNewMethod {
return @"new test method";
}
@end
然而,我看到的一个区别是,在Ruby中,一旦在运行时打开并修改了一个类,该类的所有后续使用都会受到影响,换句话说,它是一个系统范围的更改,而在Objective-C中只有导入此头文件(以及任何子类)的代码才会受到影响。 还有其他差异吗?
答案 0 :(得分:3)
然而,我看到的一个区别是,在Ruby中,一旦在运行时打开并修改了一个类,该类的所有后续使用都会受到影响,换句话说,它是一个系统范围的更改,而在Objective-C中只有导入此头文件(和任何子类)的代码才会受到影响
使用类扩展编译的程序(或库)中的Nope-in Objective-C,所有类都会受到影响,即使您的代码从不导入相关的头文件,因此该功能非常类似于Ruby。
答案 1 :(得分:2)
另一个区别是,在ruby中,您可以打开一个类并将实例变量添加到类中:
irb(main):002:0> class String
irb(main):003:1> def a=(v)
irb(main):004:2> @v = v
irb(main):005:2> end
irb(main):006:1> def a
irb(main):007:2> @v
irb(main):008:2> end
irb(main):009:1> end
=> nil
irb(main):010:0> s = "string"
=> "string"
irb(main):011:0> s.a = "blah"
=> "blah"
irb(main):012:0> s.a
=> "blah"
在Objective-C类别中,您无法将实例变量添加到现有类中。
然而可以使用运行时将对象与另一个对象相关联,人们经常使用它来添加,从界面看属性/ ivars。
How do I use objc_setAssociatedObject/objc_getAssociatedObject inside an object?