Objective c 是否可以在名为块的init中设置只读属性?
我正在使用builder模式来做类似的事情Objective c 是否可以在名为块的init中设置只读属性?,objective-c,objective-c-blocks,Objective C,Objective C Blocks,我正在使用builder模式来做类似的事情 - (instancetype)initUsingBlock:(void(^)(id mutableCopy))block { self = [super init]; if (self && block) { __block id mutableInstance = [self mutableCopy]; block(mutableInstance); self
- (instancetype)initUsingBlock:(void(^)(id mutableCopy))block
{
self = [super init];
if (self && block)
{
__block id mutableInstance = [self mutableCopy];
block(mutableInstance);
self = [mutableInstance copy];
}
return self;
}
以及使用块设置属性。我这样做的目的是不必为这个类的每个子类重写init。但是这些属性是只读的,如果试图在另一个类中调用的块中设置它们,则会出现错误。有没有正确的方法__布洛克在这里似乎没有什么不同
编辑:因此,由于下面的一条评论,我意识到继续我试图做的事情并不是一个好主意,所以我完全放弃了构建器模式,但我仍然不知道这是否可行。是的,您可以使用NSObject方法来做,但实际上这样做不是一个好的做法:
@interface TestClass : NSObject
@property (copy, nonatomic,readonly) NSString *testProperty;
@end
@implementation TestClass
- (instancetype)initUsingBlock:(void(^)(id instance))block {
if (self = [super init]) {
block(self);
}
return self;
}
@end
或:
PS:它适用于从NSObject继承的所有类型或仅符合NSKeyValueCoding协议的类型。为尚未初始化的对象创建可变副本[自可变副本]意味着什么?另外,您知道mutableCopy不会神奇地使类的属性读写,对吗?您是否采用了NSMutableCopy并实现了-mutableCopyWithZone:?它有什么作用?最后,关于这个问题,我这样做的目的是不必为这个类的每个子类重写init。[…]有没有正确的方法可以做到这一点?我要恭敬地说,没有,没有正确的方法可以做到这一点。这是个坏主意。如果我错了,请纠正我,但这在任何情况下都有效吗,即使在init块之外?在self=[super init]调用之后,它将在任何地方都有效请注意,这里使用的键值编码并不适用于所有类型。
TestClass *test = [[TestClass alloc] initUsingBlock:^(id instance) {
if ([instance respondsToSelector:@selector(testProperty)]) {
[instance setValue:@"It's working" forKey:@"testProperty"];
}
}];
NSLog(@"%@", test.testProperty);
TestClass *test = [[TestClass alloc] init];
if ([test respondsToSelector:@selector(testProperty)]) {
[test setValue:@"It's working" forKey:@"testProperty"];
}