Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 扩展类或创建类别以自定义现有框架?_Objective C_Class_Oop_Objective C Category - Fatal编程技术网

Objective c 扩展类或创建类别以自定义现有框架?

Objective c 扩展类或创建类别以自定义现有框架?,objective-c,class,oop,objective-c-category,Objective C,Class,Oop,Objective C Category,我需要从一些第三方框架中定制一些现有类的方法和属性。我知道我可以扩展类或创建类别。但是,如果我想保持框架的源代码不变,并且只创建自己的添加/扩展,那么哪种方法更有效 在我的特殊情况下,我希望检索.m文件中声明的classSomeClass:NSObject的私有属性: SomeClass.m @interface SomeClass() @property (nonatomic, strong) NSString *string; //... @end @implementation Som

我需要从一些第三方框架中定制一些现有类的方法和属性。我知道我可以扩展类或创建类别。但是,如果我想保持框架的源代码不变,并且只创建自己的添加/扩展,那么哪种方法更有效

在我的特殊情况下,我希望检索.m文件中声明的class
SomeClass:NSObject
的私有属性:

SomeClass.m

@interface SomeClass() 
@property (nonatomic, strong) NSString *string;
//...
@end

@implementation SomeClass 
//....
@end 

使用一个类别。类别将适用于类的所有子类,而不仅仅适用于您的一个子类。例如,假设您希望能够获取任意UIView的UIImage。如果您将UIView子类化,然后希望在UIScrollView上使用该方法,那么如果不为UIScrollView以及层次结构中要在其上使用该方法的所有其他类创建另一个子类,您将无法使用该方法

不使用子类的另一个原因是,如果框架中有一个方法返回类的实例,例如

+(classWithAPrivateProperty*)getClassWithPrivateProperty


在访问属性之前,必须使用该类中的数据创建子类的新成员

当你说“扩展”时,你是指“子类”吗?类扩展在ObjC中有一个特殊的含义。是的,我的意思是子类:CustomView:UIViewSo对于类别MyCategory+SomeClass,我可以通过在MyCategory+SomeClass中创建一个方法来访问SomeClass的私有变量,以拉取这个变量,并且永远不会修改SomeClass中的任何内容,正如我正确理解的那样。对吗?但是,访问类别中的私有变量会导致链接器错误。您应该使用诸如return[self-valueForKey:@“varFromSomClass”]之类的技巧;分类法。不确定这是否完全合法,但它确实如预期的那样起作用。