kullan ileri beyanname: @class ViewController;
#import "ViewController.h"
yerine. İthalat, Objective-C'deki başka bir başlıkta genellikle gereksizdir.
GameController
'da ViewController
kullanırsanız, içe aktarmayı GameController.m'ye ekleyebilirsiniz.
Büyük olasılıkla dairesel bağımlılık var.
dairesel bağımlılığı belirlemek için temel bir yoldur:
GameController.h
ithalat ViewController.h
ViewController.h
ithalat GameController.h
bir birinci görülen in bildiriminde sırasına bağlıdır olacak
çeviri, ama belli ki birincisi önce gelmek zorunda kalacak çünkü bu durumda başlıklar hangisinin ilk önce gelmesi gerektiği konusunda hemfikir değiller.
Gerçek bir kod tabanında, birçok kaynak dosyada #import "ViewController.h"
olabilir. Bu çok karmaşık bağımlılıklar yaratır. Bu bağımlılıklar ObjC'de büyük ölçüde gereksizdir - çoğu zaman bir başlıktaki ileri bildirimleri kullanabilirsiniz (ve oluşturma sürelerinizi iyileştirir).
En basit durumu açıkladım, ancak 15 başlık #import ViewController.h
olduğunda ne olur? Peki, hangi başlığın bu çeviriye o dairesel bağımlılığı getirdiğini bulmanız gerekir. Bağımlılıkları iyi yönetmiyorsanız, düzinelerce (veya yüzlerce) dosyaya adım atmanız gerekebilir. Bazen, bu çeviri için önceden işlenmiş çıktıyı incelemek en kolay yoldur (örn. Rahatsız edici *.m
dosya). Bağımlılıklar en aza indirilmezse, bu çıktı yüzbinlerce satır olabilir (ve oluşturma süreleriniz doğru şekilde yönetildiyse 20 veya daha fazla kat daha hızlı olabilir). Bu nedenle, dairesel bağımlılıkları bulma karmaşıklığı büyük kodlarda hızla artmaktadır; daha fazla #import
ve başlıklarda #include
. Başlıklardaki ileri bildirimleri kullanmak (mümkün olduğunda) bu sorunu çözmektedir.
#import "GameController.h"
#import "ViewController.h" // << if you need it in this source
#import "GameObject.h" // << if you need it in this source
@implementation GameController
...
Sonra GameController.m
// includes
#import <Foundation/Foundation.h>
// forwards required by this header
@class GameObject;
@class GLKBaseEffect;
@class ViewController;
// header declarations
@interface GameController : NSObject
@property (strong) GLKBaseEffect * effect;
@property (strong) NSMutableArray * gameObjects;
@property (strong) NSMutableArray * objectsToRemove;
@property (strong) NSMutableArray * objectsToAdd;
+ (GameController *) sharedGameController;
- (void) tick:(float)dt;
- (void) initializeGame: (ViewController*) viewcontroller;//ERROR: EXPECTED A TYPE
- (void) createObject:(Class) objecttype atPoint:(CGPoint)position;
- (void) deleteObject:(GameObject*) object atPoint:(CGPoint)position;
- (void) manageObjects;
@end
GameController.h:
Örnek
Yani OP senin başlık göz önüne alındığında, gibi yazabilirsiniz aynı tedaviyi uygulayabilirsiniz ViewController.h (hangi GameController.h ithal ediyor).
'ViewController' nasıl tanımlanır? – Wain
Bu size yardımcı olabilir, benzer soru: http://stackoverflow.com/a/9607607/1422070 – edwardmp
Belki .h dosyasının içinde sınıf adını yanlış yazdınız. –