цель c, проверка, если объект не определен или ноль - PullRequest
0 голосов
/ 24 сентября 2010

Хорошо, я создал свой собственный класс (MyObject), создающий подклассы NSObject

, затем в своем коде я объявляю это:

MyObject * myObject;

Затем, в своей функции, я делаю:

if(myObject == nil)
{
 myObject = [self getObject];
}

Мой оператор if возвращает false, и я хочу, чтобы он был истинным.

В режиме отладки: просто объявив, что он присваивает ему экземпляр с некоторыми случайными значениями.Итак, мне нужно переопределить функцию init, чтобы она возвращала nil, а затем создать свою собственную функцию initWith?

Ответы [ 3 ]

5 голосов
/ 24 сентября 2010

В Objective-C, (или C в целом),

 MyObject* myObject;

внутри реализации метода не инициализирует myObject с nil. Точно так же

 int a;

не инициализирует a с 0. Это то, что люди, которые сделали C, давно решили. Был исторический разум, почему это так.

Просто явно инициализируйте его как

 MyObject* myObject=nil;

Обратите внимание, что ivar, определенный в интерфейсе класса, автоматически устанавливается на zero до вызова init.

Обновление: также обратите внимание, что myObject является указателем на реальный объект, который содержит данные. Итак, если вы просто сделаете

 MyObject* myObject;

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

 MyObject* myObject=nil;

заставляет myObject указывать на ничего . Теперь это по крайней мере последовательно ничего не делает. Что это за линия

 MyObject* myObject=[[MyObject alloc] init];

делает, чтобы выделить MyObject объект в памяти, инициализировать его, а затем заставить myObject указать на фрагмент памяти, правильно выделенный и инициализированный. Теперь, если MyObject имеет интерфейс

@interface MyObject:NSObject {
     NSString* string;
}
@end

и если вы определите метод init,

@implementation MyObject
-(id)init {
      if(self=[super init]) {
           ... do something ...
      }
      return self;
}

после успешного выполнения [super init] Objective-C гарантирует, что для параметра ivar string установлено значение nil, т. Е. string указывает на ничто. Но это не значит, что NSString выделен или инициализирован.

1 голос
/ 24 сентября 2010

объявляет MyObject равным nil:

MyObject *myObject = nil;

Таким образом, он ничего не делает.

0 голосов
/ 24 сентября 2010

Убедитесь, что вы инициализируете myObject равным нулю, например: -

MyObject * myObject = nil;

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