iVar getter /同名方法?

时间:2010-11-23 13:43:12

标签: iphone objective-c cocoa-touch

任何人都可以解释这里发生的事情,乍一看我会认为这是不好的做法。我的问题是:在下面的示例中,我使用 - (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;
}

这有意义吗?

加里。

4 个答案:

答案 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]);
    }

}