В MyModel.h, я объявил переменную делегату, как это:Каков правильный способ объявления переменной-делегата?
@property(weak) IBOutlet id <MyProtocol> delegate;
Я также видел переменный делегат объявленный как это:
@property(weak) IBOutlet NSObject <MyProtocol>* delegate;
Я задаюсь вопросом, который следует использовать.
Также Xcode 6.2 указывает, что я делаю что-то неправильно, потому что, когда я соединяю выход делегата в IB, Xcode по-прежнему показывает пустой круг слева от объявления вместо заполненного круга. Это то, что я сделал:
1) В IB я перетащил объект из библиотеки на док-станцию, и я сменил его класс на MyModel.
2) В IB я перетащил еще один объект на док-станцию, и я сменил его класс на MyController. Я объявил MyController класс вроде этого:
@interface MyController : NSObject <MyProtocol>
@property(strong) IBOutlet MyModel* model;
@end
3) В IB, я подключил выход делегата для MyModel объекта к MyController объекта.
Но в Xcode, он по-прежнему показывает пустой кружок слева от линии:
@property(weak) IBOutlet id <MyProtocol> delegate;
Другими словами, Xcode говорит выход не подключен ни к чему - пока мое приложение может связь с контроллером с использованием свойства делегирования.
Если я удалю <MyProtocol>
с этой линии, круг слева от линии заполняется, то есть Xcode говорит, что розетка теперь подключена к чему-то. Это ошибка Xcode?
Вот файлы для моего приложения HelloDelegate:
MyProtocol.h:
//
// MyProtocol.h
// HelloDelegate
//
@class MyModel; //#import "MyModel.h" doesn't work for some reason
@protocol MyProtocol
-(void)sayHello:(MyModel*)model;
@end
MyModel.h:
//
// MyModel.h
// HelloDelegate
//
#import <Foundation/Foundation.h>
#import "MyController.h"
@interface MyModel : NSObject
@property NSString* name;
-(id)initWithName:(NSString*)name;
-(void)doStuff;
@end
MyModel.m:
//
// MyModel.m
// HelloDelegate
//
#import "MyModel.h"
@interface MyModel()
@property(weak) IBOutlet id <MyProtocol> delegate;
@end
@implementation MyModel
-(void)doStuff {
[[self delegate] sayHello:self];
}
-(id) init {
return [self initWithName:@"world"];
}
//Designated initializer:
-(id) initWithName:(NSString *)name {
if (self = [super init]) {
[self setName:name];
}
return self;
}
@end
MyController.h:
//
// MyController.h
// HelloDelegate
//
#import <Foundation/Foundation.h>
#import "MyProtocol.h"
@interface MyController : NSObject <MyProtocol>
@property(strong) IBOutlet MyModel* model;
@end
MyController.m:
//
// MyController.m
// HelloDelegate
//
#import "MyController.h"
#import "MyModel.h"
#import <Cocoa/Cocoa.h>
@interface MyController()
@property(weak) IBOutlet NSTextField* label;
@end
@implementation MyController
-(void)sayHello:(MyModel*)model {
NSString* labelText = [NSString stringWithFormat:@"Hello, %@!", [model name]];
[[self label] setStringValue:labelText];
}
@end
AppDelegate.m:
//
// AppDelegate.m
// HelloDelegate
//
#import "AppDelegate.h"
#import "MyController.h"
#import "MyModel.h"
@interface AppDelegate()
@property (weak) IBOutlet NSWindow *window;
@property (strong) IBOutlet MyController* controller;
@end
@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
// Insert code here to initialize your application
[[[self controller] model] doStuff];
}
- (void)applicationWillTerminate:(NSNotification *)aNotification {
// Insert code here to tear down your application
}
@end
«Мне интересно, что я должен использовать» Ну, «должно» - это субъективно. Лучше спросить, в чем разница; есть некоторые важные отличия в отношении компилятора. – matt
@matt, Спасибо за ответ. У меня было такое подозрение. Является ли объявление id копией объекта в переменную, тогда как объявление указателя создает (слабую) ссылку? Мне также было интересно узнать, что черная цепочка связи рядом с объявлением переменной. Почему Xcode не заполняет его после того, как я установил соединение в IB? Я чувствую, что Xcode говорит мне, что объявление ошибочно. – 7stud
Нет, это не имеет никакого отношения к управлению памятью, а кругооборот Xcode - это просто причуда (Interface Builder никогда не очень хорошо разбирался в протоколах). – matt