- Molte persone insistono che devo dichiarare un iVar per la proprietà. Alcuni stanno dicendo non così, come sto usando Modern Runtime (64 bit). Posso confermare che sto usando @property con successo senza iVars da mesi ormai. Pertanto, penso che la risposta 'corretta' sia una spiegazione del perché su 64bit improvvisamente devo dichiarare esplicitamente iVar quando (e solo quando) ho intenzione di accedervi da una classe figlia. L'unico che ho visto finora è un possibile bug di GCC (grazie a Yuji). Non è così semplice dopotutto ... Per chiarire il possibile bug è questo: quando si eredita da una classe base, un bambino non può accedere all'iVar del genitore se quel bambino capita anche di implementare un accessor UNRELATED usando @synthesize PRIMA dell'accesso di iVar.(Not So) Silly Objective-C problema di ereditarietà quando si utilizza la proprietà - Bug GCC?
Mi sono grattato la testa per un paio d'ore - non ho usato molto l'ereditarietà.
Qui ho impostato una semplice classe di test B che eredita dal test A, dove viene dichiarato un ivar. Ma ottengo l'errore di compilazione che la variabile non è dichiarata. Questo succede solo quando aggiungo la proprietà e sintetizzi le dichiarazioni - funziona senza di loro.
TestA Intestazione:
#import <Cocoa/Cocoa.h>
@interface TestA : NSObject {
NSString *testString;
}
@end
TestA L'implementazione è vuota:
#import "TestA.h"
@implementation TestA
@end
TestB Intestazione:
#import <Cocoa/Cocoa.h>
#import "TestA.h"
@interface TestB : TestA {
}
@property (nonatomic, retain) NSString *testProp;
@end
TestB attuazione (Error - 'testString' è non dichiarato)
#import "TestB.h"
@implementation TestB
@synthesize testProp;
- (void)testing{
NSLog(@"test ivar is %@", testString);
}
@end
Se "accade solo quando [tu] aggiungi la proprietà e sintetizzi le dichiarazioni", non sono un'aringa rossa. Come ho già detto, in realtà causano il problema perché non esiste una variabile di istanza di stringa 'testProp'. Ho dichiarato uno e il problema è andato via. –
Ho appena controllato per assicurarmi che non stavo diventando mentalmente, e uso @property senza un ivar tutto il tempo senza problemi. Sono d'accordo che dichiarare un ivar 'lo corregge', ma in realtà non spiega il motivo per cui non riesce a compilare solo quando utilizzo l'ereditarietà. Solo per ripetere, non sto dichiarando ivars per circa 50 proprietà all'interno dello stesso progetto, in molte classi diverse, tutte senza problemi. –