Я собираюсь попытаться объяснить указатели, извините, если вы уже знаете это.
Большинство объектов objc являются указателями. Вы можете сказать, потому что у них есть * в конце имени объекта. NSString не является указателем, но NSString * является указателем.
Объект указателя NSString (NSString *) содержит только адрес пространства в памяти, где хранится эта строка. Когда вы создаете объект-указатель, вам нужно спросить у компьютера место для хранения вашего объекта. В objc вы делаете это, вызывая статический метод alloc. Так
NSString* s = nil; //s contains NOTHING
s = [[NSString alloc] stringWithString:@"hello"]; //space in memory is created for s, s contains the address to that memory. That memory block now holds "hello".
Теперь ваш компьютер хочет, чтобы вы сказали, если вы больше не будете использовать этот блок памяти. Это когда вы звоните
[s release];
, чтобы ваш компьютер знал, что он может захватить этот блок памяти (я полагаю, вы знаете об управлении памятью в противоположном стиле, с которым работает objc). Если вы попытаетесь получить доступ к этому блоку памяти ПОСЛЕ того, как он перестанет быть вашим, тогда вы получите все эти забавные ошибки памяти.
Теперь, когда вы вызываете метод, который требует от вас передать объект, такой как
[foo doSomethingWith:s];
То, что вы на самом деле передаете, это не объект "привет", вы передаете указатель на адрес в памяти, который содержит "привет". Такой способ работы очень удобен, когда у вас ОГРОМНАЯ структура данных (например, массив размером в 1 000 000). Вместо того, чтобы передавать огромный массив в функцию, вы просто передаете указатель этого массива. Это быстрее и эффективнее.
Так, когда вы должны освободить выделенные объекты? Обычно вы хотите освободить их , когда они вам больше не нужны , но в той же функции, в которой вы их разместили. Если они являются переменными экземпляра, вы размещаете их в функции init вашего класса, а освобождаете в функции dealloc. Во многих случаях вам не нужно сохранять / копировать вещи , поэтому, если у вас нет ошибок памяти, я бы не стал беспокоиться об этом.
Надеюсь, это поможет XD. Если какая-либо информация не является точной для objc, извините. Я изучил управление памятью на C ++, и оно совершенно другое.