Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 是否可以在名为块的init中设置只读属性?_Objective C_Objective C Blocks - Fatal编程技术网

Objective c 是否可以在名为块的init中设置只读属性?

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

我正在使用builder模式来做类似的事情

- (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"];
}