任何人都可以解释这里发生的事情,乍一看我会认为这是不好的做法。我的问题是:在下面的示例中,我使用 - (id)模型创建了一个新的getter模型(即从@property覆盖原始模型),或者我只是使用这个新的相同命名方法屏蔽@property getter? / p>
@implementation PlanetController
@synthesize model;
@synthesize planetLabel_01;
@synthesize planetLabel_02;
@synthesize planetLabel_03;
- (id)model {
if(!model) {
PlanetModel *tempModel = [[PlanetModel alloc] init];
[self setModel:tempModel];
[tempModel release];
}
return model;
}
这有意义吗?
加里。
答案 0 :(得分:3)
你在做什么并不是坏习惯。你没有覆盖或掩盖任何东西。 @synthesize只会合成所需的内容。在这种情况下,设置器。
答案 1 :(得分:2)
正如其他人所说,这绝对没问题。使用您的模型方法而不是合成的方法。
但是要小心:你已经实现了一个非原子的方法,所以你的属性应该有以下声明:
@property (nonatomic, retain) id model;
否则它就是在实施它。
答案 2 :(得分:0)
您已为模型属性实现了自己的访问者。这是一个非常有效的事情。您可以验证这是执行aPlanetController.model
或[aPlanetController model]
时执行的实施。
答案 3 :(得分:0)
对我来说看起来不错,但您可以随时通过在运行时打印方法名称来检查它。
#import <objc/objc.h>
#import <objc/runtime.h>
#include "SFUtility.h"
/*!
@abstract spits out the objc/runtime.h information for the class
*/
void SFInvestigateOBJC(id obj) {
unsigned int total_method_count = 0;
Method * method_list = class_copyMethodList(object_getClass([obj class]), &total_method_count);
@try
{
SFLog(@"ClassName: %s", class_getName(object_getClass([obj class])));
SFLog(@"ClassName: %@", [obj class]);
uint method_counter = 0;
for (method_counter = 0; method_counter < total_method_count; method_counter++)
{
Method method = method_list[method_counter];
// check if method the KVC getter you are interested in
SFLog(@"Method: %s", sel_getName(method_getName(method)));
}
NSDictionary *props = [[obj entity] propertiesByName];
for (NSString *s in [props allKeys]) {
SFLog(@"KVC: %@", s);
}
} @catch (NSException *e) {
SFError(@"Exception: %@", [e description]);
}
@try {
SFLog(@"Entity: %@",[[obj entity] name]);
SFLog(@"EntityClassName: %@", [[obj entity] managedObjectClassName]);
} @catch (NSException * e) {
SFError(@"Exception: %@", [e description]);
}
}