id_1
,id_2
,id_3
id_2
和id_3
来自id_1
id_1
可以拥有公共getter / setter id_2
和id_3
只有readonly
访问权限。所以我需要覆盖id_1
的setter来设置id_2
和id_3
的有效id_1
id_1
可能来自NSUserDefaults
,这意味着init
,我需要设置id_2
和id_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文章中,我看到了关于递归循环的担忧
.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
答案 0 :(得分:0)
您强调的关注点是创建一个分配周期。因为您要分配给ivar本身,所以不会创建循环。请记住,操纵ivar不会导致你的getter / setter被调用 - 它只是一个像任何其他指针一样的指针。
将静态设置为自身不是问题,除非您在setter实现中做了一些事情以使其成为问题。在非ARC系统中,您可以通过使用错误的顺序实现setter来轻松创建错误的访问错误:
- (void)setVal:(NSObject *)val {
[_val release];
_val = [val retain];
}
这可以通过使用autorelease
来代替(或分配给临时变量并在retain
之后发布)。
但是,大多数情况下,当传递新的(或相同的)值时,你的二传手不会做任何破坏性的事情。你的实现不会这样做。