2012-03-29 8 views
0

Dieses auf NewsstandKit.framework nicht streng verwandt, aber es gibt ein anschauliches Beispiel für diesen Ansatz gibt es in:Wie erstellt man eine neue Instanz der Foo-Klasse, ohne ihren Konstruktor in der Schnittstelle offenzulegen?

addIssueWithName:date: Instanzmethode NKLibrary ein Problem Kiosk schafft - NKIssue - und fügt sich die Inhaltsbibliothek und im Fall der Nicht -Faulheit gibt es zurück. An dieser Stelle NKIssue Instanz hat name und date Eigenschaften werden zunächst auf Werte addIssueWithName:date: gesetzt.

Wenn Sie, dass Check-out, hat NKIssue Klasse eine bestimmte Initialisierungsverfahren nicht haben (ausgenommen Leitungs init von NSObject geerbt) noch @public Instanzvariablen (z _name und _date) und seine Eigenschaften sind alle readonly.

So verstehe ich nicht, wie diese ganze Sache intern funktionieren könnte? Ich würde gerne diesen Ansatz in einer meiner Bibliotheken nachahmen, aber kann nicht wirklich herausfinden, wie ...

Vielen Dank.

Antwort

0

Apples Code hat Zugriff auf Apples Code. Die readonly Eigenschaften von NKIssue werden wahrscheinlich in einer Klassenerweiterung als readwrite deklariert. Werfen Sie einen Blick auf "Property Redeclaration" in TOCPL.

in der Kopfzeile sehen Sie:

@interface Carborundum : NSObject 
@property (readonly, copy, nonatomic) NSString * whiskers; 
@property (readonly, retain, nonatomic) NSDate * inception; 
@end 

In der Implementierungsdatei (oder eine andere private Datei) gibt es eine Klasse-Erweiterung, die die gleichen Eigenschaften hat, mit den exakt gleichen Attributen (dies erforderlich ist), mit Ausnahme readonly .

@interface Carborundum() 
@property (copy, nonatomic) NSString * whiskers; 
@property (retain, nonatomic) NSDate * inception; 
@end 

Sie sind wie üblich synthetisiert:

@implementation Carborundum 

@synthesize whiskers; 
@synthesize inception; 

@end 

Dies ermöglicht Code, der die Klassenerweiterung sehen kann (dh andere UIKit-Code), die Eigenschaften als read-write zu verwenden, während Sie den Code, die nur Zugriff auf den Header hat, ist auf die schreibgeschützte Version beschränkt. Dies wird vom Compiler erzwungen, nicht von der Laufzeit.

Es gibt eine ganze Reihe von SO Fragen, die in diese gehen: https://stackoverflow.com/search?q=%5Bobjc%5D+redeclare+property

+0

Wie würden Sie '@ synthesize' diejenigen bei der Umsetzung bitte? – Ali

Verwandte Themen