Objective-C类别与其他语言的功能相比较

时间:2013-09-07 17:20:26

标签: java objective-c ruby objective-c-category

我试图在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中只有导入此头文件(以及任何子类)的代码才会受到影响。 还有其他差异吗?

2 个答案:

答案 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?