Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
-(void)setObject:(NSObject *)obj
{
id tmp = _obj;
_obj = [obj retain];
[tmp release];
}- (void) setObject:(NSObject *)obj
{
if(obj != _obj) {
[_obj autorelease];
_obj = [obj retain];
}
}
In a reference counted environment, Cocoa expects there to be an autorelease pool always available. If a pool is not available, autoreleased objects do not get released and you leak memory. In this situation, your program will typically log suitable warning messages.
NSString *a = (__bridge NSString*)my_cfref; // пустой каст
Блоки по-прежднему необходимо копировать.
//локальная переменная someBlockType someBlock = ^{NSLog(@"hi");}; [someArray addObject:[someBlock copy]];
int i = 0;
NSLog(@"%@",[^{NSLog(@"i = %d", i);} class]);
// __NSStackBlock__
__NSStackBlock__, т.е по выходу из области видимости указатель на блок станет невалидным, поэтому нам надо скопировать его в кучу, тогда в массиве будет храниться верный указатель: int i = 0;
NSLog(@"%@",[[^{NSLog(@"i = %d", i);} copy] class]);
//__NSMallocBlock__
int i = 0;
dispatch_block_t someBlock = ^{NSLog(@"i = %d", i);};
NSLog(@"%@",[someBlock class]);
// __NSMallocBlock__
__strong dispatch_block_t someBlock = ...; затем при инициализации strong переменной объекту посылается retain, а в соответствии с документацией ARC такой retain для блоков разворачивается в Block_copy. Итого, блок уже в куче.copy и release на них никак не влияют. NSLog(@"%@",[^{NSLog(@"hi");} class]);
NSLog(@"%@",[[^{NSLog(@"hi");} copy] class]);
// __NSGlobalBlock__
// __NSGlobalBlock__
Важная и полезная особенность ARC: сразу после деаллокации слабыеи сильныессылки обнуляются, то есть становятся равными nil.
objc_loadWeak (или аналог), которая проверяет, жив ли ещё объект, и загружает его. К слову, слабые ссылки из-за этого относительно медленные. Но не настолько, чтобы их опасаться. :) Это определенно очень крутая и на мой взгляд самая полезная штука во всём ARC. Можно отказаться от ручного управления только ради них, если остальное вас не привлекает.О циклических ссылках компилятор предупредит
__typeof(self) __weak weakSelf = self;
SomeBlockType someBlock = ^{
[weakSelf someMethod];
};
Используйте ARC. Это проще, безопаснее и сэкономит вам время и нервы.
id cachedObject = self.delegate;
if (cachedObject) {
[self.delegate doSomeTask];
}
cachedObject = nil;id cachedObject = self.delegate;
if (cachedObject) {
self.delegate = nil;
[cachedObject doSomeTask];
}Зачем обнулять делегат? В коде как раз сделано кеширование и проверка на nil, так как cachedObject содержит strong ссылку на делегат он не удалиться до того как cachedObject жива.
[self.delegate doSomeTask];ну он станет nil только если вручную выставлят проперти в nil, сам обьект не удалиться пока на него есть сильная ссылка(cachedObject).
id cachedObject = self.delegate;
if (cachedObject) {
[self.delegate doSomeTask];
}
cachedObject = nil;[self.delegate doSomeTask];конкретно этот пример — не знаю. но допусти нужно сделать еще какой-то код только когда есть делегат и вызвать потом метод делегата. если проверять отдельно и потом вызывать — есть шанс что делегата уже не будет.
if(self.delegate){
//SOME LOGIC
[self.delegate doSomeTask];
}
Что нужно знать об ARC