Указатели, примитивы и свойства в классах Objective-C - PullRequest
3 голосов
/ 14 июля 2009

Мне действительно нужны некоторые разъяснения - у меня есть несколько вопросов, и я сейчас все перепутал.

Вот простой интерфейс класса:

#import <UIKit/UIKit.h>

@interface Car : NSObject{
    NSInteger carID;
    NSString *carName;
}

@property (nonatomic, assign) NSInteger carID;
@property (nonatomic, copy) NSString * carName;
@end
  1. Почему carID не объявлен как указатель?
  2. Почему он использует «assign» для carID вместо «copy»?
  3. Зачем вообще объявлять учеников указателями? (В моей основной программе мой объект Car будет использоваться в качестве указателя.)

Ответы [ 4 ]

5 голосов
/ 14 июля 2009

NSInteger - это просто определение типа для примитивного типа (int на 32-битном, long на 64-битном) - это , а не объект, и поэтому не может быть сохраняется или копируется.

Члены класса всегда указатели; вы никогда не пропускаете «настоящие» объекты; как это было бы, в лучшем случае, неуправляемым.

Редактировать: Чтобы расширить последний абзац: экземпляры класса Objective-C всегда существуют в куче, а не в стеке; это облегчает такие вещи, как подсчет ссылок и жизненный цикл самоуправляемых объектов.

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

1 голос
/ 15 июля 2009

Свойство для carID не совсем корректно. Для типов, которые не являются указателями, правильное определение выглядит следующим образом:

@property (nonatomic) NSInteger carID;

Это всегда будет копировать значение в любом случае, но «копировать» имеет совсем другое значение в свойствах - для объектов он будет вызывать [object copy], когда это свойство используется для установки нового значения.

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

0 голосов
/ 15 июля 2009

Я хотел бы добавить пояснение, почему вы хотите использовать:

@property (nonatomic, copy) NSString * carName;

вместо

@property (nonatomic, retain) NSString * carName;

Ключевое слово copy подразумевает семантику языка, для которой вы хотите, чтобы COPY NSString передавалась в вашу текущую ссылку на объект. Таким образом, указатель не меняется (поэтому вам не нужно освобождать объект ref).

Ключевое слово retain позволяет получить указатель, который будет сохранен, так как ссылка на указатель изменится для этого элемента данных (и текущий будет освобожден). Копирование NSString может быть не очень сложной операцией, поэтому копирование NSString используется часто. Вы должны быть осторожны, какой тип имущества вы объявляете копируемым. Может потребоваться значительное количество усилий для создания копии типов, таких как словари и т. Д. (См. Мелкую, глубокую копию и т. Д.).

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

0 голосов
/ 15 июля 2009

Спасибо, ребята!

Итак, в Objective-C у вас есть int и Pointer Int.

Как вы объявляете это в цели C

- это обычный int.

-Pointer Int - объектное представление целого числа. Поскольку это объект, он также может указывать на указатели *. Правильно?

А указатели Pointer Int могут указывать на указатели любого типа, если бы я хотел. Правильно? Это вызовет сбой, если он не будет указывать на указатель типа int. Но он успешно скомпилируется, верно?

Но в каких случаях я бы предпочел использовать обычное int для Pointer Int?

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