Проблема не в new, а в addObject, который является методом возврата void.
Ваш код:
[[ClassA new] addObject:[[ClassA new] addObject:[ClassA new]]];
будет больше эквивалентен этому Java-коду:
ClassA = new ClassA()->AddObject( new ClassA()->AddObject( new ClassA() ) );
, что приведет к ошибке по той же причине, что AddObject возвращает void, а не self.
Кроме того, код явно потерпит неудачу, поскольку new является методом «владения», что означает, что вы получаете право собственности на созданный объект в соответствии с правилами управления памятью , и все же вы передаете его Затем добавьте addObject и забудьте об этом, чтобы никто не выпустил его. Более того, вы даже не сохраняете ссылку на конечный объект.
Соответствующий код будет выглядеть примерно так:
ClassA* c2 = [ClassA classA];
[c2 addObject:[ClassA classA]];
ClassA* c = [ClassA classA];
[c addObject:c2];
где метод ClassA ClassA реализован как:
(ClassA*) classA
{
return [[ClassA new] autorelease];
}
В качестве альтернативы, вы можете добавить еще один метод:
(ClassA*) classAWithObject: (ClassA*) inObject
{
ClassA* c = [ClassA classA];
[c addObject:inObject];
return c;
}
, а затем напишите:
ClassA* c = [ClassA classAWithObject:[ClassA classAWithObject:[ClassA classA]]];
, который был бы как очень верным для способа Какао / Objective C, и эквивалентен вашему Java-коду, и фактически подчинялся бы правилам управления памятью.