2015-04-22 2 views
0

Я узнаю о alloc и init, но я не понимаю, что это значит. они приводили примерСложность понимания Alloc и init

NSString *emptyString = [[NSString alloc] init]; 
NSArray *emptyArray = [[NSArray alloc] init]; 
NSDictionary *emptyDictionary = [[NSDictionary alloc] init]; 

И я понятия не имел, для чего он будет использоваться.


Далее мне пришлось использовать stringWithString и сделать это. не знаю, что здесь происходит. Может кто-нибудь помочь мне, но объяснить это понятным/легким вопросом. спасибо

NSString *firstName = @"Daniel"; 
NSString *copy = [[NSString alloc] stringWithString:firstName]; 
NSLog(@"%@ is a copy of %@", copy, firstName); 

ответ

1

Первая точка:

Если вы знакомы с кодом C++, при создании объекта, в основном создается новый экземпляр этого класса следующим образом:

ClassA object1= new ClassA(); 

new - не что иное, как alloc+init в объективе-C

ClassA *object1 = [[ClassA alloc] init]; 

Вторая точка:

[NSString stringWithString:@"some string"] 

Это эквивалентно

[[NSString alloc] initWithString:@"some string"] 

Вот еще информация:

Alloc: метод Класс NSObject. Возвращает новый экземпляр класса-получателя.

init: Метод экземпляра NSObject. Реализовано подклассами для инициализации нового объекта (приемника) сразу после того, как память была выделена.

новый: метод класса NSObject. Выделяет новый экземпляр класса-получателя, отправляет ему сообщение init и возвращает инициализированный объект.

выпуск: экземпляр метода делегата NSObject. Уменьшает счетчик ссылок получателя.

autorelease: экземпляр метода делегата NSObject. Добавляет приемник в текущий пул автозаполнения.

сохранить: экземпляр метода делегата NSObject. Увеличивает счетчик ссылок получателя.

копия: экземпляр метода делегата NSObject. Возвращает новый экземпляр, который является копией получателя.

Так заключение можно сказать, что

Alloc идет с INIT

новый = Alloc + INIT

Более подробную информацию можно найти https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaEncyclopedia/Initialization/Initialization.html

+0

Следует отметить, что C++ 'new SomeClass()' фактически представляет собой две операции: операция 'new' (которая может быть переопределена, но редко есть) и конструктор' SomeClass() '. Они достаточно близки к 'alloc' и' init'. –

+0

Обратите внимание, что 'new' может использоваться:' ClassA * object1 = [ClassA new]; ' – zaph

1
  1. Создание пустой массив и словарь являются немного странно; обычно вы делаете это только с их изменчивыми версиями. Я полагаю, что пустую строку можно использовать для сравнения с другими строковыми объектами, но даже тогда, используя @"", кажется, что ее было бы легче читать.

    alloc - метод класса, который выделяет пространство для объекта соответствующего класса. init - это метод экземпляра, который инициализирует этот новый экземпляр, чтобы он мог корректно вести себя как объект этого класса.

  2. Это неправильное использование stringWithString; вы не должны использовать его с alloc. Что-то вроде:

    NSString *copy = [firstName copy]; 
    

    было бы более уместным.

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