Ios 在实例变量上调用属性的setter方法 我有3个属性id\u 1,id\u 2,id\u 3 id_2和id_3是从id_1 id_1可以有公共getter/setter id_2和id_3只有readonly访问权限

Ios 在实例变量上调用属性的setter方法 我有3个属性id\u 1,id\u 2,id\u 3 id_2和id_3是从id_1 id_1可以有公共getter/setter id_2和id_3只有readonly访问权限,ios,Ios,因此,我需要覆盖id_1的setter来设置id_2和id_3的有效id_1 _id_1 = id_from_ns_user_defaults [self setid_1:_id_1]; id\u 1可以来自NSUserDefaults,这意味着在init中,我需要设置id\u 2和id\u 3 因此,我想从init调用id\u 1的setter,就好像我是使用ivar从课堂之外调用的一样 _id_1 = id_from_ns_user_def

因此,我需要覆盖
id_1
的setter来设置
id_2
id_3
的有效
id_1

        _id_1 = id_from_ns_user_defaults
        [self setid_1:_id_1];
  • id\u 1
    可以来自
    NSUserDefaults
    ,这意味着在
    init
    中,我需要设置
    id\u 2
    id\u 3
  • 因此,我想从
    init
    调用
    id\u 1
    的setter,就好像我是使用
    ivar从课堂之外调用的一样

  •         _id_1 = id_from_ns_user_defaults
            [self setid_1:_id_1];
    
  • 这将给我一个单一的实现,在
    init
    阶段或在外部调用时设置所有ID

我的问题是在我的代码中有以下两行代码,因为我调用
id\u 1
setter,参数为
ivar\u id\u 1

        _id_1 = id_from_ns_user_defaults
        [self setid_1:_id_1];
在其他几篇SO文章中,我看到了关于递归循环的担忧

.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

您突出关注的是创建分配周期。因为您正在分配给ivar本身,所以不会创建循环。请记住,操纵ivar不会导致调用getter/setter——它只是一个指针,与任何其他指针一样


将ivar设置为自身不是问题,除非您在setter实现中做了一些事情使其成为问题。在非ARC系统中,通过使用错误的顺序实现setter,很容易产生错误的访问错误:

- (void)setVal:(NSObject *)val {
  [_val release];
  _val = [val retain];
}
相反,可以使用
自动释放
(或指定一个临时变量,并在
保留
后释放)


不过,大多数情况下,当传递新(或相同)值时,setter不会做任何破坏性的事情。您的实现没有做到这一点。

如果
id\u 2
id\u 3
是从
id\u 1
派生出来的,为什么要存储它们的值?为什么不在需要的时候实现计算值的getter呢?我想我的计算和其他用途都很昂贵……但我只是想知道我所做的是否可以posted@michaels..thanks因为我指出了…我不是朝那个方向想的。。。