IOS Custom NSObject Casting - PullRequest
       1

IOS Custom NSObject Casting

0 голосов
/ 02 марта 2011

Если у меня есть пользовательский объект NSO с именем Human, у которого есть подкласс с именем Male, и у меня есть массив с именами people, содержащий объекты Human. При переборе массива people я могу привести объект, такой как:

for (Human *human in humans) {
    Male *male = (Male *)human;
}

или лучше создать метод для initWithMale, например

for (Human *human in humans) {
    Male *male = [[Male alloc] initWithMale:(Male *)human];
}

Каков был бы наилучший подход с точки зрения управления памятью или это не имеет значения? Если это последнее, то как бы я справился с этим в моем методе initWithMale?

Спасибо

Ответы [ 2 ]

10 голосов
/ 02 марта 2011

Это зависит от того, чего вы пытаетесь достичь. Если объекты в массиве людей являются прямыми экземплярами человека, то вы не можете привести их к какому-либо подклассу человека, поскольку они не относятся к этому типу. Если этот сценарий верен и вы пытаетесь преобразовать Человека в Мужчину, то вам нужно будет создать метод init в классе Мужчин, который может инициировать новый объект, используя предоставленного Человека:

Male *male = [[Male alloc] initWithHuman: human];

При таком подходе ваш метод initWithHuman должен либо сохранить переданный в Human экземпляр и ссылаться на его значения, либо скопировать любые необходимые данные. Более поздний подход может быть добавлен к самому классу Human, и это позволит вам инициировать любой подкласс, используя метод initWithHuman (по сути, создавая базовую функцию копирования).

Если массив people содержит подклассы Human, вы можете привести их к правильному экземпляру, однако вам следует сначала проверить, являются ли они этим экземпляром. Вот пример:

for (Human *human in humans) {
    if ([human isKindOfClass:[Male class]]) {
        Male *male = (Male *) human;
    }
}
0 голосов
/ 04 декабря 2012

Вам не нужно приводить объект типа id.

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