/ / Cieľové-C kategórie neumožňuje pridať premenné inštancie [duplicate] - objektív-c, vlastnosti, kategórie, ivar

Cieľové kategórie C neumožňujú pridať premenné inštancie [duplicate] - objektív-c, vlastnosti, kategórie, ivar

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ď č. 1

Odpoveď 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.