-2

鉴于某些属性和方法在我的所有视图中都是稳定的,因此我在我的应用程序类中有很多重复的代码。

我正在寻找扩展我正在使用的任何类,以便自动将我认为应该对这些类通用的所有内容inheritproperties and methods

我查看了关于扩展课程的苹果指南。但我对我能达到的遗传水平感到困惑。

我已经成功创建Categories了一个UIViewController. 但这限制了我只能声明Methods。我不能在 my 或扩展类中声明Properties并调用Category它们。Category我希望能够Properties在我的扩展类内部和外部声明和使用它。

这是我第一次尝试在objective-c中扩展一个类,充分利用继承,但我不知道这是否可能。我错过了什么吗?

作为下面代码中的示例,每次我尝试activityIndicatorView在我的方法中实例化_activityIndicator它时它都无法识别它。我已经尝试过@syntetize@dynamic但它不起作用

注意:我正在根据如何实现方法和属性的继承来寻求答案。没有强调哪些类别不能做(因为我已经尝试过并且知道我不能在那里拥有属性)

我的尝试达到了

#import <UIKit/UIKit.h>

@interface UIViewController (customViewController1)

@property (strong, nonatomic) UIView *activityIndicatorView;
- (void) _activityIndicator;
@end

#import "UIViewController+customViewController1.h"

@implementation UIViewController (customViewController1)


- (void) _activityIndicator {
//......
}
4

4 回答 4

1

你的问题太宽泛了,而且不清楚你的问题是什么。是的,您可以在 Objective-C 中进行子类化。

这在 Apple 的文档“Object-Oriented Programming with Objective-C”,“对象模型”部分,“继承”小节中都有很好的记录。

于 2013-10-05T10:40:23.933 回答
0

类别是添加功能的好方法,同时符合面向对象的原则,优先考虑组合而不是继承。类别只添加方法,您不能使用类别将变量添加到类中。如果该类需要更多属性,则必须对其进行子类化。

于 2013-10-05T10:34:51.330 回答
0

使用术语“扩展”时,您指的是创建子类。这就是 IIRC,该术语在 Java 和其他一些语言中的使用方式。

Apple 使用不同的术语(正如 Hermann Klecker 在他的第一条评论中暗示的那样)。它们的字面意思是用更多功能(以方法的形式)扩展现有的类——这就是类别的作用。这是正常的英文定义;在现实世界中扩展某些东西通常不会创造出新事物。

Objective-C 也支持子类;它只是不称它们为“扩展”超类。这称为创建子类,它继承自超类。

于 2013-10-05T17:58:41.723 回答
-1

严格地说,您不能向现有类添加属性,这与创建子类不同。

如果您不能停止自己并且不能选择子类化,那么您可以使用 getter 和 setter 来扩展您想要存储在类中的属性的类。与其将其真正存储为您无法做到的成员/实例变量/属性,不如使用objc_setAssociatedObject(id object, void *key, id value, objc_AssociationPolicy policy).

这是某种具有两个键的全局字典,键本身和您要将存储对象关联到的对象。在您的情况下,这是扩展类类型的对象。setter 将其存储在那里,而 getter 从那里使用objc_getAssociatedObject.

nil您通过发送asvalue来删除关联objc_setAssociatedObject

AFAIK 保留的关联对象(值)在持有关联(对象)的对象被释放后不久被释放。

有关更多详细信息,请参阅 Ojbective-C 运行时参考https://developer.apple.com/library/ios/documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html

只是:我并不是说这严格遵循 OO 范式。:-)

于 2013-10-07T12:07:22.817 回答