在其实例变量上调用属性的setter方法

时间:2015-03-02 19:19:15

标签: ios

  • 我有3个属性id_1id_2id_3
  • id_2id_3来自id_1
  • id_1可以拥有公共getter / setter
  • id_2id_3只有readonly访问权限。

所以我需要覆盖id_1的setter来设置id_2id_3的有效id_1

  • id_1可能来自NSUserDefaults,这意味着init,我需要设置id_2id_3
  • 所以,我想从id_1拨打init的setter,就像我使用ivar _id_1

    从课堂外打电话一样
  • 这会给我一个实现,以便在init阶段或外部调用时设置所有ID

我的问题是我的代码中有两行,因为我调用id_1 setter ,参数为ivar _id_1

        _id_1 = id_from_ns_user_defaults
        [self setid_1:_id_1];

在其他一些SO文章中,我看到了关于递归循环的担忧

Custom Getter & Setter iOS 5

.h文件

@interface UserCredentials : NSObject

@property (strong, nonatomic) NSString *id_1;
@property (readonly) NSString *id_2;
@property (readonly) NSString *id_3;

@end

.m文件

@interface UserCredentials ()

@property (readwrite) NSString *id_2;
@property (readwrite) NSString *id_3;

@end

@implementation UserCredentials

- (id)init
{
    self = [super init];
    if (self) {

         /* Is this valid in Objective-C */

        _id_1 = id_from_ns_user_defaults
        [self setid_1:_id_1];
    }
    return  self;
}


- (void)setid_1:(NSString *)id
{
   if (id && ![id isEqualToString:@""]) {
          _id_1 = id;
          _id_2 = convert2(_id_1);
          _id_3 = convert3(_id_1);
   }

}

@end

1 个答案:

答案 0 :(得分:0)

您强调的关注点是创建一个分配周期。因为您要分配给ivar本身,所以不会创建循环。请记住,操纵ivar不会导致你的getter / setter被调用 - 它只是一个像任何其他指针一样的指针。


将静态设置为自身不是问题,除非您在setter实现中做了一些事情以使其成为问题。在非ARC系统中,您可以通过使用错误的顺序实现setter来轻松创建错误的访问错误:

- (void)setVal:(NSObject *)val {
  [_val release];
  _val = [val retain];
}

这可以通过使用autorelease来代替(或分配给临时变量并在retain之后发布)。

但是,大多数情况下,当传递新的(或相同的)值时,你的二传手不会做任何破坏性的事情。你的实现不会这样做。