Self с массивом и addObject - PullRequest
       36

Self с массивом и addObject

0 голосов
/ 17 августа 2011

При вставке объекта в массив со свойством, есть ли причина вызывать метод получения / установки с помощью self?то есть

[self.myArray insertObject: myObject];

Или я могу просто использовать:

[myArray insertObject: myObject];

суть будет:

.h

@interface ArrayViewController : UIViewController <UITextFieldDelegate>
{
   NSMutableArray *myArray;
   int itemNumber;
}
@property (nonatomic, retain) NSMutableArray *myArray;
@end

.m

- (IBAction)createMyArray 
{
    self.myArray = [[NSMutableArray alloc] initWithObjects: nil];
}

-(IBAction) addItemToMyArray
{

    NSString *myString = [[NSString alloc] initWithFormat:@"item %d",itemNumber];

    [myArray addObject: myString];
    //[self.myArray addObject: myString]; //Or should I use self?
    [myString release];

    NSLog(@"myArray = %@", myArray);

    itemNumber++;
}

//- (void)dealloc etc. not shown

Ответы [ 6 ]

1 голос
/ 17 августа 2011

Концептуально это не имеет значения, если ваш метод получения возвращает только существующее значение поля и не выполняет, например, какое-то выделение «точно в срок» или что-то подобное.

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

Я склонен всегда использовать self. для свойств, просто чтобы напомнить себе, что они на самом деле являются свойствами, и уменьшить вероятность того, что я 'Случайно установите значение, не используя обозначение свойства.

1 голос
/ 17 августа 2011

Либо будет работать, но вы должны знать, что вы делаете. Использование self. вызовет методы установки / получения, в то время как другие просто получат прямой доступ к переменной. Непосредственное использование переменной, хотя и абсолютно допустимое, не рекомендуется использовать вне метода initializer и dealloc. Причина в том, что вы теряете преимущества свойства, особенно настройки, используя self., потому что оно правильно назначит / скопирует / сохранит значение для вас правильно. Другая причина, по которой переменные свойств не используются напрямую, связана с атомарностью, но в вашем случае вы объявили ее как nonatomic.

0 голосов
/ 17 августа 2011

В вашем случае это не обязательство использовать self.myArray, но для этого случая ниже будет обязательство:

-(void) addItemToMyArray:(NSAarray *)myArray
{

    NSString *myString = [[NSString alloc] initWithFormat:@"item %d",itemNumber];

    [self.myArray addObject: myString];
    [myString release];

    NSLog(@"myArray = %@", self.myArray);

    itemNumber++;
}

для различия между атрибутом класса и аргументом функции.

0 голосов
/ 17 августа 2011

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

0 голосов
/ 17 августа 2011

При использовании alloc / init вам не следует устанавливать возвращаемое значение для свойства, так как они будут сохранены дважды:

self.myArray = [[NSMutableArray alloc] initWithObjects: nil];

использовать

myArray = [[NSMutableArray alloc] initWithObjects: nil];

или

self.myArray = [NSMutableArray array];

для инициализации.

Операции вставки эквивалентны.

0 голосов
/ 17 августа 2011

Оба из них в порядке. Это в основном стилистический выбор. Использование self.myArray приведет к вызову получателя [self myArray].

...