Расширяет базовый класс, чтобы перезаписать что-то анти-паттерн в Objective- C - PullRequest
0 голосов
/ 13 февраля 2020

В объективе - c.

Допустим, я sh предоставлю пользовательское представление контента для UICollectionView (по какой бы то ни было причине).

Я понимаю, что единственный способ добиться этого - это

@interface UICollectionViewCell (Extension)
@property(nonatomic, readwrite)UIView *contentView;
@end

@interface BaseCollectionViewCell()

@property(nonatomic, readonly)UIView *hairuiView;

@end

@implementation BaseCollectionViewCell

- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.contentView = [[UIView alloc] init];
    }
    return self;
}


@end

По сути, я расширяю представление содержимого для чтения и записи, так что теперь я могу сделать его любым пользовательским представлением. хотеть.

Это считается анти-паттерном в Objective- C

1 Ответ

0 голосов
/ 13 февраля 2020

Основная идея c о добавлении специализированного метода к существующему классу (UICOllectionViewCell) через категорию - это просто замечательно.

Так что определение -(UIView*)hairuiView круто.

Однако другие вещи, которые вы пытаетесь сделать, не крутые:

(1) Вы не можете переопределить метод через категорию.

Возможно (хотя и не поддерживается явно) переопределить метод, реализованный в суперклассе, но вы не можете переопределить метод в классе категории.

Компилятор часто разрешает это, но во время выполнения реализуется только один из методов (либо класс 'original'). метод или тот из категории), а не оба. И что еще хуже, нет никакой гарантии, какой из них выберет среда выполнения (все зависит от порядка загрузки классов).

Кроме того, [super ...] в категории будет ссылаться на суперкласс класса, не класс, к которому вы добавляете категорию.

(2) Не следует использовать расширение для классов, которые вы не написали.

Расширение - это просто анонимная категория с некоторыми дополнительными перки. Однако вам следует создавать расширение только для написанного вами класса (и компилировать в этом проекте). Вы не можете добавлять расширения к классам, которые вам не принадлежат или уже скомпилированы. (Расширения позволяют определять дополнительные переменные экземпляра, и это можно сделать только один раз во время компиляции; вы не можете добавить переменные экземпляра в класс, который уже определен / скомпилирован.)

Поэтому придерживайтесь обычных категорий, чтобы расширить существующие классы. Ограничения по категориям, встроенные в язык, как правило, избавят вас от неприятностей - за исключением переопределения в (1).

Это нормально:

@interface BaseCollectionViewCell (HairuiView)
@property (nonatomic,readonly) UIView *hairuiView;
@end

@implementation BaseCollectionViewCell (HairuiView)

- (UIView*)hairuiView
{
    ...
}

@end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...