由于我无法在Objective-C中的类别中创建合成属性,因此我不知道如何优化以下代码:
@interface MyClass (Variant)
@property (nonatomic, strong) NSString *test;
@end
@implementation MyClass (Variant)
@dynamic test;
- (NSString *)test {
NSString *res;
//do a lot of stuff
return res;
}
@end
Run Code Online (Sandbox Code Playgroud)
该测试方法被调用运行时多次,我做了很多的东西来计算结果.通常使用合成属性我会在第一次调用方法时将值存储在IVar _test中,并且下次只返回此IVar.我该如何优化上面的代码?
我已经看了很多关于这个主题的帖子.也许我没有碰到"那个",有人会指出我朝这个方向发展.问题很简单,可能有一个简单的答案.
如果你有两个ivars,比如说,"public_ivar"和"private_ivar",你应该在哪里/如何声明它们,以便public是公共的,什么是private是不会以任何方式暴露给任何查看头文件的人?
在"public_method"和"private_method"的情况下也是同样的问题.
我喜欢干净的头文件(在其他语言中),只显示我希望别人看到的方法和ivars.您应该能够发布您的头文件,而不会遇到某人访问他们不应该访问的东西的危险.你如何在Objective-C中做到这一点.
例如,假设我决定需要使用ivar来跟踪所有需要访问此信息的各种类方法之间的某些数据,计数器或类似的东西.如果在@interface下的标题中传统地声明了这个ivar,那么它的存在是公开广告的,任何创建该类实例的人都可以使用它.理想的情况是,这个ivar在类实现之外根本不可见.
我正在继承pod的类,在这个类中有一个私有实例变量,我想在我的类中公开和使用:
@interface MySuperClass () {
UIScrollView *_scrollView;
}
Run Code Online (Sandbox Code Playgroud)
通常在暴露私有成员或方法的情况下,我会使用类似于此前提到过的类别,但我在使用私有实例变量时遇到问题.我在这里读到联想参考可能有用,但我无法使它工作.
有关类别属性问题的问题很多.我知道解决这个问题的一些可能性:
从我的角度来看,两者都不干净,因为在创建此类属性的对象被释放时,永远不会清除分配的内存.
类别是保持代码清洁并向现有类动态添加功能的好方法.它们有助于将功能和分布式实现工作分组到更多开发人员中.
类别的坏处是缺少存储.
我现在多次遇到这个问题而且我想知道以下是否会以一种干净的方式解决这个问题,这也会照顾内存,如果有任何我现在看不到的问题.
有一个限制,我可以忽略,因为我是一个框架开发人员:我能够创建我自己的所有其他类可以继承的根类.
首先声明新的根对象:
@interface RootObject : NSObject
- (void)setRuntimeProperty:(id)runtimeProperty forKey:(id<NSCopying>)key;
- (id)runtimePropertyForKey:(id)key;
@end
Run Code Online (Sandbox Code Playgroud)
与相应的实现:
#import "RootObject.h"
@interface RootObject ()
@property (readwrite) NSMutableDictionary *runtimeProperties;
@end
@implementation RootObject
@synthesize runtimeProperties = _runtimeProperties;
- (id)init {
self = [super init];
if (self)
{
_runtimeProperties = [[NSMutableDictionary alloc] initWithCapacity:1];
}
return self;
}
- (void)dealloc {
[_runtimeProperties release];
_runtimeProperties = nil;
[super dealloc];
}
- (id)runtimePropertyForKey:(id)key {
return [self.runtimeProperties objectForKey:key];
} …Run Code Online (Sandbox Code Playgroud)