Chcel by som vedieť, prečo dizajn kategórií objektov C navrhol tak, že nemôžeme pridať inštančné premenné.
A taktiež som zistil, že pomocou objektov Cieľ-C môžeme robiť. Mám však väčší záujem, aký je hlavný dôvod.
odpovede:
0 pre odpoveď č. 1Odpoveď bola upravená, aby hovorila o premenných inštancií namiesto vlastností.
Pridávanie premenných inštancie na objekt sa zmeníatribúty pamäte objektu a vyžaduje, aby bol objekt znova kompilovaný.Kategórie pridávajú nové metódy k existujúcim objektom bez toho, aby vyžadovali rekompiláciu a preto nemôžu pridávať premenné inštancie.
Ako hovoríte, môžete pridať vlastnosti, v ktorých sú dáta uložené a načítané pomocou asociatívneho ukladacieho priestoru.
EDIT:
Ak máte triedu FooClass so záhlavím, ako je táto:
//FooClass.h
@interface FooClass : NSObject
@property (nonatomic, strong) NSString *bar1;
@end
Definuje triedu s jednou vlastnosťou bar1
a podporovaný premennou inštancie _bar1
.
Externá kategória FooClass
nemôže pridať ďalšie premenné inštancie FooClass
.
Môžete si však vytvoriť "súkromnú kategóriu"súbor .m pre FooClass, ktorý môže definovať ďalšie vlastnosti (s premennými inštancií podkladov) do triedy. Funguje, pretože tieto ďalšie premenné inštancie sú známe v čase kompilácie a môžu byť "pečené" do triedy. Tu je príklad:
// FooClass.m
@interface FooClass()
@property (nonatomic, strong) NSString*bar2;
@end
@implementation FooClass
@end
Všimnite si deklaráciu extra @interface s ďalšou vlastnosťou. Keďže je v rovnakom súbore .m ako implementácia, nie je vystavený iným súborom, ale je to je známe v čase kompilácie, takže kompilátor môže pridať potrebné premenné (y) inštancie.