我一直負責清除代碼庫中的一些Clang錯誤。我對iPhone開發和目標C非常陌生,但發現大多數問題都是微不足道的......儘管如此,當我確信它有些尷尬時,這個問題仍然困擾着我。Objective-C:'self'未設置時使用的實例變量...但它是
從ZAttributedString類:
- (id)initWithAttributedString:(ZAttributedString *)attr {
NSParameterAssert(attr != nil);
if ((self = [super init])) {
_buffer = [attr->_buffer mutableCopy];
_attributes = [[NSMutableArray alloc] initWithArray:attr->_attributes copyItems:YES];
}
return self;
}
該鐺警告是「使用實例變量而‘自我’沒有被設置爲的‘[超級或自] INIT ...]’的結果,與ATTR的_buffer屬性的非關聯被突出
如果有幫助,警告也似乎提的是,發現問題,從這個方法調用時:
- (id)copyWithZone(NSZone *)zone {
return [(ZAttributedString *)[ZAttributedString allocWithZone:zone] initWithAttributedString:self];
}
燦任何人請向我解釋這裏的缺陷究竟是什麼?
TIA!
其實,這個代碼是從'ZAttributedString'類,所以它是完全正確的使用' - 來自同一類的其他實例>'訪問的ivars。當你基本上創建一個「拷貝構造函數」時,這在這樣的代碼中是合適的。 – rmaddy
即使在這種情況下,也不是很正確。 *如果*它是'-copy'方法本身,那麼*可能*(即使這在ObjC的歷史中是一個非常粗糙的邊緣 - 「NSCopyObject()」並沒有引起痛苦)。但不是在DI中。該類可能具有執行某些操作的getter的邏輯,並且入境實例可能很可能是行爲未知的子類。 – bbum
@bbum:「傳入ATTR可以是ZAttributedString實例或子類的實例」'self'也可能是子類的實例,因此通過這樣的說法,你永遠無法訪問實例變量,這顯然是不正確的。 – user102008