2015-01-05 3 views
2

Может ли кто-нибудь объяснить мне, где именно переменные, хранящиеся в объекте c?Хранение переменных свойств объекта Objective C и переменных non property

В файле .h

@interface example: NSObject 
{ 
    NString *string;  // where is this stored 
    int  number;  // where is this stored 
} 
@property (nonatomic,strong) NSURL* mURL; // where is this stored 

@end 

аналогично,

В .m файл

# import "xyz.h" 

NSString *constant = @"hello"; // where is this stored 

@interface example() 
{ 
    NString *textg;  // where is this stored 
    int  numb;  // where is this stored 
} 
@property (nonatomic,strong) NSURL* sURL; // where is this stored 

@end 
+0

FYI - Не помещайте ivars в открытый интерфейс (обычно файл .h). Поместите их только в расширение частного класса или блок '@ implementation' (который вы не видите в коде). – rmaddy

+0

Просьба уточнить, что вы подразумеваете под «где это хранится?». – rmaddy

+0

Я имел в виду хранить на куче или стеке? – rishu1992

ответ

2

"строка", "textg", "число" и «онемения "являются переменными экземпляра для класса. Разница в том, что «строка» и «число» могут быть общедоступными (через ref-> number), а «textg» и «numb» являются частными (так как другие классы обычно не #import .m-файлы).

Свойства «mURL» и «sURL» сохраняются как переменные экземпляра «_mURL» и «_sURL». Опять же, «_mURL» имеет право быть общедоступным (через ref -> _ mURL), а «_sURL» - по той же причине.

И «постоянная» - это обычная глобальная переменная, хранящаяся в куче.

+1

Хороший ответ. Чтобы добавить к этому ответу: переменные экземпляра или свойства, объявленные в .m, являются частными. – John

+0

Одна ошибка - синтезированный ivar '_mURL' для свойства' mURL' не будет общедоступным и не может быть доступен через 'ref -> _ mURL'. Собственность общедоступна, но ивара нет. – rmaddy

+0

Одно уточнение - 'константа' является файлом глобального и может быть доступен только из одного и того же файла .m. – rmaddy

1

Вы спрашиваете:

где именно переменные сохраненную

Чтобы ответить только так: все, кроме constant переменные и переменные, используемые свойства, сохраняются как часть распределение памяти для каждого экземпляра вашего класса example, который вы создаете. Каждый экземпляр имеет свою собственную копию каждой переменной. Например. когда вы делаете:

example *anExample = [example new]; 

Вы запрашиваете, что экземпляр example создается и ссылка на него сохраняется в anExample. Этот экземпляр содержит все переменные и свойства экземпляра, которые вы объявили (а также содержит любые переменные экземпляра и свойства для своих суперклассов, в этом просто NSObject).

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

HTH

+0

Хорошо, спасибо. Могу ли я узнать, в чем разница между строкой и mUrl, которые я объявил. Доступ к mUrl можно получить публично. Но не строка. Тогда в чем разница в том, что iVar в файле .h и iVar в файле .m. Кроме того, что такое использование объявления в частном порядке в файле .m? – rishu1992

+0

@ rishu1992 - Это несколько разных вопросов, и вы найдете ответы на них все на SO. Почему бы не искать и не задавать другой вопрос, если вы что-то не понимаете? Чтобы вы делали, по умолчанию что-либо в .h является общедоступным, что-то только в .m not. Частная собственность похожа на частный метод - для использования самим классом. – CRD

Смежные вопросы