4

In Objective-C bin ich neugierig, wie Zugriffssteuerungen für Instanzvariablen wie @private, @protected usw. implementiert sind.Wie wird @private implementiert?

Ich hatte angenommen, dass getrennte Strukturen wurden in gewisser Weise wie diese erzeugt wird:

entlang der Linien von

struct Class_Foo_Protected { 
    int bar; 
}; 

struct Class_Foo_Private { 
    int baz; 
}; 

struct Class_Foo_Public { 
    int qux; 
}; 

Aber ich habe wirklich keine Ahnung

@interface Foo { 
    int bar; 
    @private 
    int baz; 
    @public 
    int qux; 
} 

=> etwas. Wer weiß, wie das wirklich gemacht wurde?

Antwort

7

Diese Modifizierer ändern nichts am Speicherlayout Ihrer Klasse. Der Compiler selbst merkt sich, welcher Ivar öffentlich, geschützt oder privat ist, und gibt Fehler aus, wenn Sie versuchen, von einem unpassenden Ort aus darauf zuzugreifen. Dies geschieht alles bevor ein Code generiert wird und hat keinen Einfluss auf den generierten Code.

+0

Sehr interessant, danke. –

+5

Um das klarzustellen, können Sie Runtime-Methoden verwenden, um auf jeden Ivar jeder Klasse zuzugreifen, und nichts wird Sie davon abhalten (abgesehen von der allgemeinen Umgehung dieser Vorgehensweise). '@ private' ist reine Metadaten für den Compiler, und nichts mehr. –

Verwandte Themen