Проблемы наследования в Objective C

Для выхода из сценария, можно использовать,

import sys
sys.exit()

можно также обеспечить значение статуса выхода, обычно целое число.

import sys
sys.exit(0)

Выходы с нулем, который обычно интерпретируется как успех. Ненулевые коды обычно рассматривают как ошибки. Значение по умолчанию должно выйти с нулем.

import sys
sys.exit("aa! errors!")

Печать "aa! ошибки!" и выходы с кодом состояния 1.

существует также _exit () функция в модуле OS. sys.exit () функция повышает исключение SystemExit для выхода из программы, таким образом попробуйте операторы, и код очистки может выполниться. OS. _ выход () версия не делает этого. Это только заканчивает программу, не делая никакой очистки или сбрасывая буферы вывода, таким образом, это не должно обычно использоваться.

документы Python указывают на ту OS. _ выход () является нормальным способом закончить дочерний процесс, созданный вызовом к os.fork (), таким образом, он действительно имеет использование при определенных обстоятельствах.

6
задан Joe 12 August 2009 в 19:35
поделиться

4 ответа

Короткий и простой ответ: не создавайте подкласс NSArray. Лучше создать категорию в NSArray или создать подкласс NSObject, у которого есть ivar NSArray, с которым вы разговариваете.

Длинный технический ответ: NSArray - это кластер классов . Это означает, что на самом деле это не один класс, а множество классов, работающих под интерфейсом абстрактного класса NSArray, каждый из которых реализован по-разному (скажем, одна реализация для небольших массивов, другая для больших массивов и т. Д.). Чтобы создать подкласс кластера классов, вы должны реализовать все примитивные методы абстрактного класса, от которого вы наследуете, управлять своим собственным хранилищем и в основном заново реализовать все вещи, которые вы надеялись получить бесплатно путем создания подклассов.

Подробнее просто, вы можете просто создать категорию, если не не требуются дополнительные ivars. Если вам нужен объект, который ведет себя как массив с дополнительным состоянием, вы можете создать класс с NSArray и использовать пересылку сообщений Objective-C для пересылки всего, кроме вашего настраиваемого поведения, этому классу.

37
ответ дан 8 December 2019 в 02:07
поделиться

Это связано с природой «Кластеров классов», используемых для классов коллекций в Foundation. Видеть: Кластеры классов

По сути, NSMutableArray определяет открытый интерфейс для «изменяемых массивов», но не является фактическим классом, который вы используете при инициализации. Итак, initWithCapacity: определен, но не реализован в NSMutableArray. Если вы запустите:

NSMutableArary *foo = [[NSMutableArray alloc] init];
NSLog(@"%@", [foo className]);

, вы напечатаете «_NSCFArray», который является конкретным подклассом NSMutableArray (и NSArray). Чтобы обойти это, у меня была бы переменная экземпляра, которая является NSMutableArray, или реализовать initWithCapacity: с подходящим значением (например, емкость «3» означает сетку 3x3).

7
ответ дан 8 December 2019 в 02:07
поделиться

Хорошо, я нашел ответ в на этот вопрос

Хотя вопросы разные, ответ тот же самый, и это связано с настройкой NSArray (и, следовательно, NSMutableArray ), вы не можете создать подкласс без реализации методов самостоятельно.

Думаю, я просто добавлю в SDMutableGrid переменную NSMutableArray вместо того, чтобы на самом деле быть NSMutableArray.

2
ответ дан 8 December 2019 в 02:07
поделиться

Это работает и правильно определяет многие выпуски продуктов Windows, включая Windows XP, Windows 7 (Home, Professional), Windows Server 2003 и Windows Server 2008, и содержит код, который должен идентифицировать Windows 8 и Windows Server 2012. Он компилируется на Delphi 2007, XE2 и XE3 и был протестирован на WinXP Professional (SP2 и SP3), Windows 7 Pro 64-bit и Windows Server 2003/2008 (32-bit 2003, 64- бит 2008 г.). Он должен работать со многими другими, но у меня нет их для тестирования.

Код предоставляет определения для D2007, которые отсутствуют в модуле Windows , динамически загружает функции, доступные в более поздних версиях Windows и использует их, когда они доступны (но не выйдет из строя, если они не найдены). Он содержит несколько устаревших способов обнаружения Win95 / ME / NT4; - [NSMutableArray initWithCapacity:]: метод, определенный только для абстрактного класса. Определить - [SDMutableGrid initWithCapacity:]! ' 2009-08-12 15: 27: 02.080 Flipswitch [1756: 20b]

Итак, вам нужно определить initWithCapacity в своем подклассе, я бы рекомендовал не расширять NSMutableArray, в этом нет необходимости, просто создайте класс с изменяемым массив в нем.

2
ответ дан 8 December 2019 в 02:07
поделиться