Когда использовать свойства и инициализацию выделения - PullRequest
0 голосов
/ 26 декабря 2011

Я просто работал над своим приложением, где мне нужно было установить значение переменной экземпляра NSMutableData.Теперь я также создал свойство для своей переменной экземпляра, что означает, что моя программа автоматически выделяет его и т. Д., Верно?Но затем я присвоил ему значение, но оно не принимало его, а оставалось нулевым.Затем я вручную выделил его, а затем он вдруг принял значение.Итак, теперь мой вопрос заключается в том, зачем нужны свойства и зачем мне вручную выделять переменную экземпляра, хотя для меня настроено свойство?

Заранее спасибо!

edit:мой код:

в моем .h файле У меня есть

@interface FirstScreen : UIViewController{
NSMutableData* fetchedData;

}

@property(nonatomic, retain)NSMutableData*fetchedData;

в моем .m файле:

-(void) connectionDidFinishLoading:(NSURLConnection *)connection{
NSString* fetchedDataString= [[NSString alloc]initWithData:fetchedData      encoding:NSUTF8StringEncoding];
}

Теперь, если я не реализую:

-(void)viewDidLoad{
self.fetchedData=[[NSMUtableData alloc]init];
}

fetchedDataString не имеет никакого значения.Однако, если он выделен, он имеет значение.Я путаюсь, когда выделять переменные экземпляра, а когда нет.

Ответы [ 3 ]

1 голос
/ 27 декабря 2011

Теперь я также создал свойство для моей переменной экземпляра, что означает, что моя программа автоматически выделяет его и т. Д., Верно?

Неверно.Если вы синтезируете методы доступа для свойства, для него также будет создан ивар, если вы его еще не создали.Но ваше свойство - это просто указатель ... оно не указывает ни на что, пока вы не создадите объект, на который он будет указывать, и не установите его:

self.fetchedData = [[NSMutableData alloc] init];
1 голос
/ 26 декабря 2011

Не выделяет.Все свойства для вас - это определить переменную экземпляра и реализовать методы доступа.

Я предполагаю, что «присваивая значение», вы подразумеваете попытку установить содержимое объекта NSMutableData, который, как вы думали, был выделен для вас.

0 голосов
/ 27 декабря 2011

Это C. То, что вы говорите, верно для каждой отдельной переменной, будь то локальная переменная или переменная экземпляра. Одно дело объявить хранилище для переменной (это все, что вы делаете, объявив недвижимость). Это другое, чтобы придать этому значение. Это объявление в коде:

NSMutableArray* arr;

... не заставляет arr принимать какое-либо конкретное значение (в ARC это ноль; до ARC это может быть что угодно). Это, конечно, не пустой изменяемый массив! Но это точно аналогично тому, что вы делаете, когда объявляете свойство.

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

NSMutableArray* arr = [NSMutableArray array];

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

Я написал книгу на эту тему (программирование на iOS), и главу, посвященную вашей проблеме, можно прочитать в Интернете:

http://www.apeth.com/iOSBook/ch03.html

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