これはベータ版の問題ではありません。私はXcode 6.0.1の製品版をリリースしています。私が抱えている問題は、作業中のコードをビルドまたは実行しようとすると、Xcodeが長時間応答しなくなり、SourceKitServiceがCPUの400%以上を消費することです(アクティビティモニターによると)。この問題はここ数日で新しくなりましたが、奇妙なことに、9月17日に公式にリリースされて以来、Xcode 6.0を使用していました。
問題が何であるかについてのアイデアはありますか?
今日の午後、Xcode 6.1.1でこの問題に遭遇しました(ベータ版ではなく、公式リリース版)。私はプレイグラウンドでいくつかのコードを実行していましたが、それが原因だと疑っていました。 CPUはほぼ100%に固定され、Xcodeはビルドを完了できませんでした。
だからここに私がやったことがあります:
1.「Activity Monitor」を開き、SourceKitServiceがメインCPUホグとして表示されました。
2.「アクティビティモニター」内で、SourceKitServiceをダブルクリックし、「ファイルとポートを開く」セクションをクリックしました。これは、/ Users/myname/Library/Developer/Xcode/DerivedData/ModuleCache /ディレクトリの下のファイルで動作していることを示しています特定のフォルダ用。
3.指定されたフォルダーを削除しました(コマンドラインから、rm -rfを使用)。キャッシュは Xcode派生データフォルダーのコンテンツを安全に削除できますか? に基づいて再生成されます。
4.再度アクティビティモニターを使用して、SourceKitServerを強制終了します。 SourceKitServiceがクラッシュしたことを示す、Xcode内のあまりにも馴染みのある記号を見ました(そのため、SourceKitServiceはおなじみのように聞こえました!)。
5.手順3を繰り返した。
Macは再び平和です。データは失われず、Xcodeを再起動する必要さえありませんでした(これは失敗しました)。一番下の行は、ModuleCacheがループ内でSourceKitServiceを取得しているようで、フォルダーを削除すると問題が修正されるようです。これがあなたにも役立つことを願っています。
ブートノート:
ところで、SourceKitServiceの問題の原因は、Swiftクラスの配列宣言が長すぎることです。配列には200を超えるエントリがありました。 30に減らし、エラーはなくなりました。そのため、Appleコードでのある種のスタックオーバーフローが原因で問題が発生した可能性があります(しゃれが意図されています)。
この問題は、次のような約60個の要素を持つ配列を宣言しているために発生していました。
let byteMap = [
["ECG" : (0,12)],
["PPG" : (12,3)],
["ECG" : (15,12)],
["PPG" : (27,3)],
["ECG" : (30,12)]
このように明示的に型に注釈を付けることにより:
let byteMap : [String: (Int, Int)] = [
["ECG" : (0,12)],
["PPG" : (12,3)],
["ECG" : (15,12)],
["PPG" : (27,3)],
["ECG" : (30,12)],
停止させることができました。 Swiftの型推論と型チェックに関係があり、長い配列に遭遇するとループに入るようにしなければならないと思います。
これはXcode 6.2にありました。上記のようにModuleCacheも削除しましたが、現在はすべて正常です。
この問題は、実際のデバイスを接続してシミュレーターを実行しなかった場合に10回、8回発生しました。
私のソリューションが良いものかどうかはわかりませんが、私にとって問題はシミュレータと実際のデバイスの切り替えによるものだと思います。奇妙に聞こえるかもしれませんが、まるでキャッシュファイル間の干渉を作成しているかのようでした。
私の問題を解決したもの:
Alt + Shift + Command + K
Command + Shift + K
。したがって、基本的に新しいデバイスで実行する前に、キャッシュを削除するだけです。
デバイスに接続せずに問題が発生しました。 Xcodeを終了して再度開いたところ、問題はなくなりました。私guessは、新しいコードをフェッチ/プルマージした後のインデックス再作成の問題になる可能性があるかどうかはわかりません。
SourceKitServiceが最大13GBのメモリを使用する原因となっていた別の問題を解決しました...
String(format行に多くの引数がありました:
return String(format: "%d,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f", samples.count,sum1.x,sum1.y,sum1.z,sum1.rx,sum1.ry,sum1.rz,sum2.x,sum2.y,sum2.z,sum2.rx,sum2.ry,sum2.rz,sum3.x,sum3.y,sum3.z,sum3.rx,sum3.ry,sum3.rz)
これに置き換えた場合、正常に機能しました(メモリが蓄積せず、通常のCPU消費)
var output: String = ""
output += String(format: "%d,", samples.count)
output += String(format: "%.3f,%.3f,%.3f,", sum1.x, sum1.y, sum1.z)
output += String(format: "%.3f,%.3f,%.3f,", sum1.rx, sum1.ry, sum1.rz)
output += String(format: "%.3f,%.3f,%.3f,", sum2.x, sum2.y, sum2.z)
output += String(format: "%.3f,%.3f,%.3f,", sum2.rx, sum2.ry, sum2.rz)
output += String(format: "%.3f,%.3f,%.3f,", sum3.x, sum3.y, sum3.z)
output += String(format: "%.3f,%.3f,%.3f", sum3.rx, sum3.ry, sum3.rz)
return output
私にとっては、派生データを削除するのに役立ちました。メニューから[製品]を選択し、Altキーを押しながら[ビルドフォルダーのクリーンアップ]を選択します。ショートキー:Alt + Shift + Command + K
私はそのような問題に直面しました。ソースキットサービスは10 GBの使用量を使用していました。アクティビティモニターのSwiftプロセスの使用量が6 GBを超えています。私は次のコードを使用していました:
var details:[String:Any] = ["1":1、 "2":2、 "3":3、 "4":4、 "5":5、 "6":6、 "7": 7、「8」:8、「9」:9、「10」:10、「11」:11、「12」:12、「13」:13、「14」:14、「15」:15、 "16":16]
この問題を解決するために、コードを次のように変更しました。
var details:[String:Any] = [:]
詳細["1"] = 1
詳細["2"] = 2
詳細["3"] = 3
詳細["4"] = 4
詳細["5"] = 5
詳細["6"] = 6
詳細["7"] = 7
詳細["8"] = 8
詳細["9"] = 9
詳細["10"] = 10
詳細["11"] = 11
詳細["12"] = 12
詳細["13"] = 13
詳細["14"] = 14
詳細["15"] = 15
詳細["16"] = 16
プロジェクトの長いコンパイルで問題を見つけるために4時間を費やしています。最初の試行はコンパイルに42分かかります。
@LNIが示唆したように、SourceKitService
を再起動した後に/Users/myname/Library/Developer/Xcode/DerivedData/ModuleCache/
からすべてのキャッシュをクリアし、コードにいくつかの変更を適用します。
1)へ
var initDictionary:[String:AnyObject] = [
"details" : "",
"duration" : serviceDuration,
"name" : serviceName,
"price" : servicePrice,
"typeId" : typeID,
"typeName" : typeName,
"url" : "",
"serviceId" : serviceID,
"imageName" : ""
]
から
var initDictionary= [
"details" : "",
"duration" : serviceDuration,
"name" : serviceName,
"price" : servicePrice,
"typeId" : typeID,
"typeName" : typeName,
"url" : "",
"serviceId" : serviceID,
"imageName: "" ]
2)へ
if let elem = obj.property,
let elem2 = obj.prop2,
etc
{
// do stuf here
}
から
let value1 = obj.property ?? defaultValue
3)
に
let serviceImages = images.filter { $0.serviceId == service.id }
let sorted = serviceImages.sort { $0.sort > $1.sort }
から
let serviceImages = images.filter { $0.serviceId == service.id }. sort { $0.sort > $1.sort }
結果としてコンパイル時間-3分、それほど速くはありませんが、42分間はより良いです。
その結果、SourceKitService
の前-〜5,2Gbのメモリを使用し、〜0.37Gbの後にメモリを使用します
データ型を指定せずに、または[String:Any]を使用して、Swiftに辞書を作成しないでください。
「Any」型を使用すると、コンパイラはデータ型をチェックするために無限ループに陥る可能性があります。
コンパイルエラーは発生しません。「Swift」および「SourceKitService」という名前のタスク用に多くのメモリを取得し、「Swiftソースファイルのコンパイル」でMacがフリーズします。
これはまだxcodeバージョン7.3.1(7D1014)の問題です。LNIが指摘したように、私にとっての原因は、実際にはそれほど長くない配列です。配列を次のようなさまざまな配列に分割することで問題を修正しました。
let firstLevel = [
[1, 0, 1, 0, 1],
[0, 0, 0, 0, 0],
[1, 0, 1, 0, 1],
[0, 0, 0, 0, 0],
[1, 0, 1, 0, 1],
[0, 0, 0, 0, 0]
]
let secondLevel = [
[0, 0, 0, 0, 0],
[0, 1, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 1, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]
]
let thirdLevel = [
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]
]
let map = [firstLevel, secondLevel, thirdLevel]
この動作は、自分から継承したクラスを誤って宣言したときに私のプロジェクトに現れました。 Xcode 8.2.1、Swiftを使用3。
rm -rf ~/Library/Developer/Xcode/DerivedData/ModuleCache/*
LNIの受け入れられた答えとこれとの違いに注意してください。
プロジェクトをSwift 3に移行した後、同じ問題に直面していました。データ型なしで作成された辞書と配列のために時間がかかっていた解決策を見つけてください。
私もこの問題を抱えていました。私の場合、次のような大きな配列を宣言していました。
var myArray: [(String, Bool?)]?
myArray = [("someString", someBool),
("someString", someBool),
("someString", someBool),
("someString", someBool),
("someString", someBool)
.
.
("someString", someBool)]
私はすべてではなく、行ごとにアイテム1を追加することで問題を解決しました。
var myArray = [(String, Bool?)]()
myArray.append(("someString", someBool))
myArray.append(("someString", someBool))
myArray.append(("someString", someBool))
myArray.append(("someString", someBool))
myArray.append(("someString", someBool))
.
.
.
これにより問題が修正されました。
長い配列を関数に変換すると、問題が解決するようです:
var color: [UIColor] {
return [
UIColor(...),
UIColor(...),
...
]
}
に:
func color() -> [UIColor] {
return [
UIColor(...),
UIColor(...),
...
]
}
Xcode 8.2.1でも同様の問題が発生しています。1,000行以上のコードのセクションが/ * * /でコメントアウトされています。セクションをコメントアウトすると問題が発生し、コメントアウトしたコードを削除すると修正されました。
Objective-Cプロジェクトの場合:
私は同じ問題を抱えていましたが、プロジェクトにはSwiftコードがゼロであるため、型推論チェッカーではありませんでした。
ここで他のすべてのソリューションを試しましたが、何も機能しませんでした-最終的に修正したのは、回復モードでコンピューターを再起動し、ディスクの修復を実行することでした。ようやく安心して働けるようになりました!
おそらく相互に指し示し、サービスを無限ループで走らせているいくつかの壊れたシンボリックリンクが原因で起こったと推測しています。
Xcode 7.2 (7C68)
で同じ問題に直面しました
解決策は、私のクラスが定義に持っていたプロトコルのメソッドを実装することでした。
killall Xcode
rm -rf ~/Library/Developer/Xcode/DerivedData/ModuleCache
open /Applications/Xcode.app
echo alias xcodeFix='killall Xcode;rm -rf ~/Library/Developer/Xcode/DerivedData/ModuleCache;open /Applications/Xcode.app' >> ~/.profile
source ~/.profile
そして、単に実行します
xcodeFix
XCode 8.2.1(8C1002)と次のコードでも同じ問題が発生しました。
import UIKit
import AVFoundation
import Photos
import CoreMotion
import Foundation
class TestViewController: UIViewController
{
let movieFileOutput = AVCaptureMovieFileOutput()
var anz_total_frames = 0, anz_total_miss = 0
@IBOutlet weak var tfStatistics: UITextView!
func showVideoStatistics()
{
let statisticText:String = "frames: \(self.anz_total_frames)" + String.newLine +
"frames/s: \(self.anz_total_frames / self.movieFileOutput.recordedDuration.seconds)" + String.newLine +
"miss: " + formatText4FramesPercent(self.anz_total_miss) + String.newLine +
"nicht erkannt: " + formatText4FramesPercent(self.anz_total_miss) + String.newLine +
"nicht erkannt: " + formatText4FramesPercent(self.anz_total_miss) + String.newLine +
"nicht erkannt: " + formatText4FramesPercent(self.anz_total_miss) + String.newLine +
"nicht erkannt: " + formatText4FramesPercent(self.anz_total_miss) + String.newLine +
"nicht erkannt: " + formatText4FramesPercent(self.anz_total_miss) + String.newLine +
"nicht erkannt: " + formatText4FramesPercent(self.anz_total_miss) + String.newLine +
"nicht erkannt: " + formatText4FramesPercent(self.anz_total_miss) + String.newLine +
"nicht erkannt: " + formatText4FramesPercent(self.anz_total_miss) + String.newLine +
"nicht erkannt: " + formatText4FramesPercent(self.anz_total_miss) + String.newLine +
"nicht erkannt: " + formatText4FramesPercent(self.anz_total_miss) + String.newLine
self.tfStatistics.text = statisticText
}
func formatText4FramesPercent(_ anz:Int) -> String
{
let perc = Double(anz)*100.0/Double(anz_total_frames)
return String(perc.format(".1") + "%")
}
}
およびこれらの拡張機能:
extension String {
var localized: String {
return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "")
}
static var newLine: String {
return "\r\n"
}
}
extension Int {
func format(_ f: String) -> String {
return String(format: "%\(f)d", self)
}
}
extension Double {
func format(_ f: String) -> String {
return String(format: "%\(f)f", self)
}
}
TestViewControllerで次の行にコメントすることで解決しました。
"frames/s: \(self.anz_total_frames / self.movieFileOutput.recordedDuration.seconds)" + String.newLine +
それを見つけるのに1時間以上かかったので、他の人の時間を節約できるといいのですが。 Appleに番号30103533でバグレポートを提出しました
SourceKitServiceでも同じ問題が発生しました。
解決しました。ループ用にサブビューを追加しないでください。
私が使用する問題を検出するには: https://github.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode
私は複数を組み合わせて同様のものに遭遇しました??オプションの文字列値のデフォルトを提供する演算子。
2010年半ばの信頼できるMacBook Proのファンが激しく動き始めたとき、以下のデバッグコードを試していました。 SourceKitServiceは、取得できるCPUサイクルごとに吸い上げていました。問題のある行にコメントを付けてコメントを外すと、SourceKitServiceが窒息しているものが非常に明確になりました。複数を使用しているように見えますか?デフォルトを提供する演算子は、古いマシンの問題です。回避策は、それをしないことです。それを複数の割り当てに分割すると、evenいデバッグコードがさらに見苦しくなります。
placeMarkはCLPlacemarkのインスタンスです。ここで使用されるプロパティは、オプションの文字列を返します。
OS 10.12.4(16E195)で実行されているXcodeバージョン8.3.2(8E2002)を使用していました
// one term is not an issue
let debugString1 = (placeMark.locality ?? "")
// two terms pushes SourceKitService CPU use to 107% for about 60 seconds then settles to 0%
let debugString1 = (placeMark.locality ?? "") + ", " + (placeMark.administrativeArea ?? "")
// three terms pushes SourceKitService CPU use to 187% indefinitely
let debugString1 = (placeMark.locality ?? "") + ", " + (placeMark.administrativeArea ?? "") + (placeMark.postalCode ?? "")
// ugly but it's safe to use
var debugString1 = placeMark.locality ?? ""
debugString1 = debugString1 + ", " + (placeMark.administrativeArea ?? "")
debugString1 = debugString1 + " " + (placeMark.postalCode ?? "")
https://www.logcg.com/en/archives/2209.html
SourceKitServiceは、Swiftの型推論作業を担当しました。
private lazy var emojiFace = ["?", "?", "?", "?"]
明示的に入力するように変更する
private lazy var emojiFace:[String] = ["?", "?", "?", "?"]
SourceKitServiceのCPU使用率はすぐに低下します。