проблема, связанная с NSString - PullRequest
0 голосов
/ 19 января 2010

У меня есть 1 NSString * abc = @ "Hardik"; у меня есть NSMutableArray * массив; теперь я написал [массив addobject: abc];

тогда я печатаю, NSLog (@ "array =% @", array);

но я получаю NULL Зачем? Я объявил NSMutableArray * массив; в файле .h я установил @property (nonatomic, retain) NSMutableArray * array; @synthesize array;

и я синтезировал его, но получил значение NULL Я не могу этого понять?

Ответы [ 4 ]

4 голосов
/ 19 января 2010

Вам также нужно инициализировать ваш массив:

array = [[NSMutableArray alloc] initWithCapacity:10];

Это довольно фундаментальный материал. Вы уже читали " Учебное пособие по Целью C "?

3 голосов
/ 19 января 2010

Похоже, вы на самом деле не выделили array. Обычно вы делаете это в своем инициализаторе. (Не забудьте также добавить release в ваш метод dealloc.) @synthesize создает метод получения и установки, но вам все равно придется самостоятельно распределять / освобождать объект.

0 голосов
/ 19 января 2010

Чтобы вызвать синтезированный метод доступа внутри самого класса, вы должны использовать self. Если вы этого не сделаете, вы получите доступ к адресу атрибута напрямую, минуя методы доступа. Вам нужно:

NSString *abc = @"Hardik";
[self.array addobject:abc];
NSLog(@"array = %@", self.array);

Причина, по которой это важно, заключается в том, что синтезированные методы обычно также инициализируют свойство. Внутренние элементы метода синтезированного массива будут выглядеть примерно так:

-(NSArray *) array{
    if (array!=nil) {
        return array;
    }
    array=[[NSMutableArray alloc] initWithCapacity:1];
    return array;
}

self.propertyName - это просто сокращение для [self propertyName], а self.propertyName=someValue - просто сокращение для [self setPropertyName:someValue].

Пока вы не вызовете self.array хотя бы один раз, свойство массива не будет инициализировано .

Однако, просто чтобы запутать вещи, после того как вы позвонили self.array, как только он был инициализирован, вы можете просто позвонить array напрямую. Итак ...

[self.array addObject:abc];
NSLog(@"array = %@", array);

... работает, в то время как обратное будет возвращать только пустой массив.

Итак, правила таковы:

  1. В реализации класса (включая подклассы), вызывая просто propertyName дает вам адрес собственности, но не называет методы доступа методов получения / установки.
  2. В реализации класса (включая подклассы), используя self.propertyName вызывает методы доступа getter / setter но не имеет доступа к атрибуту напрямую.
  3. извне класса реализация, например myClass.propertyName вызывает методы доступа для получения / установки.
0 голосов
/ 19 января 2010

Похоже, что ваше свойство массива NSMutableArray * не было инициализировано?

Можете ли вы опубликовать свой метод инициализации класса?

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