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
的setter,就好像我是使用id\u 1
ivar从课堂之外调用的一样
_id_1 = id_from_ns_user_defaults
[self setid_1:_id_1];
init
阶段或在外部调用时设置所有IDid\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因为我指出了…我不是朝那个方向想的。。。