2017-07-31 106 views
0

我使用生成器模式做這樣的事情是否可以在init-called塊中設置只讀屬性?

- (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但這些屬性是readonly,並試圖在塊中設置它們 - 在另一個類中調用 - 會引發錯誤。有沒有正確的方法來做到這一點? __block在這裏似乎沒有什麼不同。

編輯:因此,由於這裏的評論,我意識到,繼續我想要做的事情並不是一個好主意,所以我完全放棄了構建器模式,但我仍然會不知道這是否可能。

+0

對於尚未初始化的對象('[self mutableCopy]')做一個可變副本意味着什麼?另外,你知道'mutableCopy'不會神奇地讓你的類的屬性讀寫,對吧?你採用了'NSMutableCopying'並實現了'-mutableCopyWithZone:'?它有什麼作用?最後,關於「我這樣做的目的是不必爲這個子類的每個子類重寫init [...]是否有正確的方法來做到這一點?」,我會恭敬地說,不,沒有正確的方法來做到這一點。這是一個壞主意。 –

回答

0

是的,你可以使用NSObject[setValue:forKey:]方法做它,但實際上它不是一個很好的做法這樣做:

@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 

...

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

PS:適用於所有類型i來自NSObject或僅符合NSKeyValueCoding協議的類型。

+0

糾正我,如果我錯了,但不會在任何情況下工作,即使在該init塊之外? – baguIO

+0

'self = [super init]'call – ninjaproger

+0

後,它將會無處不在。請注意,鍵值編碼(這裏使用的)不適用於所有類型。 – newacct

相關問題