Если [super init]
возвращает nil, это означает, что вы были освобождены, и ваш параметр self
теперь является недействительным указателем. Слепо следуя соглашению self = [super init]
, вы избавите себя от потенциально неприятных ошибок.
Рассмотрим следующий нестандартный инициализатор:
- (id)initWithParam:(id)param {
if (!param) {
// Bad param. Abort
self = [super init]; // What if [super init] returns nil?
[self release];
return nil;
}
else
{
// initialize with param.
...
}
}
Что теперь произойдет, если мой суперкласс решит прервать и вернуть nil? Я был удален, и мой параметр self
теперь недействителен, и [self release]
вылетит. Переназначая self
, я избегаю этого сбоя.
Я бы сделал это в два прохода - сначала удалив старые файлы, а затем пустые каталоги:
Get-ChildItem -recurse | Where {!$_.PSIsContainer -and `
$_.LastWriteTime -lt (get-date).AddDays(-31)} | Remove-Item -whatif
Get-ChildItem -recurse | Where {$_.PSIsContainer -and `
@(Get-ChildItem -Lit $_.Fullname -r | Where {!$_.PSIsContainer}).Length -eq 0} |
Remove-Item -recurse -whatif
Этот тип операции демонстрирует возможности вложенных конвейеров в PowerShell, которые второй набор команд демонстрирует. Он использует вложенный конвейер для рекурсивного определения, есть ли в каком-либо каталоге нулевые файлы.
Чтобы удалить файлы старше 30 дней:
get-childitem -recurse |
? {$_.GetType() -match "FileInfo"} |
?{ $_.LastWriteTime -lt [datetime]::now.adddays(-30) } |
rm -whatif
(Просто удалите -whatif
для фактического выполнения.)
Затем введите:
get-childitem -recurse |
? {$_.GetType() -match "DirectoryInfo"} |
?{ $_.GetFiles().Count -eq 0 -and $_.GetDirectories().Count -eq 0 } |
rm -whatif