Почему нет * перед заявлением делегата? - PullRequest
2 голосов
/ 20 марта 2010

Я только что заметил, что нет * перед объявлением для делегата ...

Я сделал что-то вроде этого:

@protocol NavBarHiddenDelegate;


@interface AsyncImageView : UIView {

    NSURLConnection* connection;
    NSMutableData* data;
    UIActivityIndicatorView *indicator;

    id <NavBarHiddenDelegate> delegate;

}

@property (nonatomic, assign) id <NavBarHiddenDelegate> delegate;

- (id)initWithUrl:(NSString*)url;

@end


@protocol NavBarHiddenDelegate 

- (void)hideNavBar;

@end

Это прекрасно работает, но поскольку я привык всегда, но * перед объектами, которые я объявляю, почему не для этого?

Спасибо,

Готье.

Ответы [ 2 ]

1 голос
/ 20 марта 2010

Это не имеет ничего общего с делегатами.

Тип id отличается по историческим причинам; думать об этом как any-object *. Всякий раз, когда вы пишете id, нет *.

Если бы был один корневой класс Object для всех объектов Objective-C, тогда вы могли бы представить, что typedef Object * id; - но нет, поэтому id отличается (ну, на самом деле, это определяется как что-то вроде struct objc_object * если я правильно помню, но вам не стоит беспокоиться об этой детализации-реализации-относительно-уровня).

1 голос
/ 20 марта 2010

Потому что id уже имеет неявное *. Если вы игнорируете ограничение протокола, то

id <NavBarHiddenDelegate> delegate;

становится

id delegate;

, который явно не нуждается в *. Кстати, если протокол установлен на тип ObjC, то вам нужен *, например

XXViewController<NavBarHiddenDelegate>* delegate;
...