Может кто-нибудь объяснить, пожалуйста, разницу между setWithObjects и initWithObjects - PullRequest
1 голос
/ 05 марта 2012

Итак, я провел последний час или около того, борясь со своим кодом, и в итоге обнаружил, что NSSet, который я пытался использовать, был пустым.Как только я переключился с первой строки кода на вторую, все работало отлично.Я просто надеялся, что кто-нибудь скажет мне, что не так с первой строкой.Он компилируется просто отлично, но, очевидно, не делает то, на что я надеюсь.

NSSet *singleOperandOperations = [singleOperandOperations initWithObjects: @"cos", @"sin", @"sqrt", nil];

против

NSSet *singleOperandOperations = [NSSet setWithObjects: @"cos", @"sin", @"sqrt", nil];

Спасибо!

Ответы [ 3 ]

4 голосов
/ 05 марта 2012

setWithObjects: - это так называемый вспомогательный конструктор , который на самом деле делает alloc, а затем initWithObjects:. setWithObjects: чуть меньше печатает. Обратите внимание, что возвращаемое id такого удобного конструктора - autorelease 'd, по соглашению.

Итак, ваш первый пример должен быть:

NSSet *singleOperandOperations = [[NSSet alloc] initWithObjects: etc...];

И это можно заменить на:

NSSet *singleOperandOperations = [NSSet setWithObjects: etc...];
1 голос
/ 05 марта 2012

Я не уверен на 100%, но я верю, что вы должны alloc это. Вот что я бы сделал:

NSSet *singleOperandOperations = [[NSSet alloc]initWithObjects: @"cos", @"sin", @"sqrt", nil];

Это сработает. Ваша другая линия тоже работает. Разница только в количестве символов, которые вы должны ввести;)

Надеюсь, это поможет

0 голосов
/ 05 марта 2012

Ну, в первом примере вам не хватает alloc. Но в общем случае вызов alloc / init выделяет объект, которым вы владеете, в то время как вспомогательный конструктор setWithObjects возвращает автоматически выпущенный объект.

...