Block behält implizit "self" bei; Erwähnen Sie explizit "selbst", um anzuzeigen, dass dies beabsichtigt ist
Angesichts der folgenden:
- (void) someMethod
{
dispatch_async(dispatch_get_main_queue(), ^{
myTimer = [NSTimer scheduledTimerWithTimeInterval: 60
target: self
selector: @selector(doSomething)
userInfo: nil
repeats: NO];
});
}
Wo myTimer deklariert ist, in eine private Schnittstelle:
@interface MyClass()
{
NSTimer * myTimer;
}
@end
Wie würde man die folgende Warnung:
Block implizit behält 'self'; explizit erwähnt, "selbst", um anzuzeigen, das ist das beabsichtigte Verhalten
Von dem, was ich bis jetzt gefunden habe, sind die meisten Vorschläge beinhalten Sie, so etwas wie:
- (void) someMethod
{
__typeof__(self) __weak wself = self;
dispatch_async(dispatch_get_main_queue(), ^{
wself.myTimer = [NSTimer scheduledTimerWithTimeInterval: 60
target: self
selector: @selector(doSomething)
userInfo: nil
repeats: NO];
});
}
Außer, dass myTimer ist ein ivar, Bedeutung wself
nicht haben Zugriff auf alle Eigenschaften.
Ich denke, meine Fragen sind:
- Tun/sollte mich das interessieren?
- Sollte ich erklären myTimer als Eigenschaft?
Benutze ich ivars einiges durch meinen code. Ich habe gerade die -Weverything
Flagge, um mein Projekt um zu sehen, ob ich finden kann, alle zugrunde liegenden Probleme, und dies ist bei weitem die häufigste Warnung. Ich habe kein problem, geht aber und es zu beheben, indem Sie meine ivars Eigenschaften, aber ich möchte sicherstellen, dass ich ein besseres Verständnis, bevor ich das tun.
InformationsquelleAutor der Frage Kyle | 2014-02-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ersetzen
myTimer
durchself->myTimer
beheben würde Ihre Warnung.Wenn Sie ein iVar
_iVar
im code, die der compiler wird den code zu ersetzen durchself->_iVar
und wenn Sie es innerhalb eines Blocks, der block wird erfasst, selbst anstelle des iVar selbst. Die Warnung ist nur, um sicherzustellen, dass die Entwickler verstehen, dieses Verhalten.InformationsquelleAutor der Antwort bsarr007
Details
Xcode: 9.2
Warnungen in Objective-C-Pods
Ich habe swift-Projekt. Warnung
Block implicitly retains 'self'; explicitly mention 'self' to indicate this is intended behavior
erscheint, wenn ich mit Objective-C-pods:Lösung 1 (manual)
Lösung 2 (automatische)
Ergebnisse
InformationsquelleAutor der Antwort Vasily Bodnarchuk
Für diejenigen von Euch, immer diese Warnungen, weil der
Bolts
/FBSDKCoreKit
/FBSDKLoginKit
sollten Sie es vermeiden, Wassili Antwort und stattdessen schweigen die Warnungen für diejenigen, die bestimmte Abhängigkeiten.Option 1
Schweigen von einzelnen pods statt nur FacebookCore und fügen Sie
inhibit_warnings: true
Option 2
Oder schweigen, alle pods, indem Sie in Ihrer Podfile:
Abschluss
Erhalten Sie noch Warnungen für Ihren eigenen code. Nicht immer sind diejenigen, die problematisch sein könnte irgendwann, das ist, warum ich glaube, dass es eine bessere Lösung.
Nächsten update der Facebook sdk, sehen Sie, wenn Sie können, entfernen Sie die
inhibit_warnings: true
oderinhibit_all_warnings!
.InformationsquelleAutor der Antwort Nycen
Kürzlich Stand ich vor der gleichen Frage und @Wassili Bodnarchuk Antwort scheint hilfreich zu sein.
Jedoch in Continuous integration-Umgebungen ist nicht möglich zu ändern, die
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF
Flagge zuNO
zur Laufzeit.Also, um das Problem zu isolieren, habe ich versucht, indem alle abhängigen GEMS installiert sind, die von Cocoapods und herausgefunden, dass gem XCODEPROJ version 1.5.7 legt die
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF
zuYES
wennpod install
- Befehl ausgeführt wird.Die Lösung für diese ist das wiederherstellen der XCODEPROJ frühere version 1.5.1 von der Ausführung
sudo gem install xcodeproj -v 1.5.1
Einmal zurückgesetzt, führen Sie einfach
pod install
und die Flagge wird gesetzt, um NICHT immer.InformationsquelleAutor der Antwort bhuvan
Das behebt mein problem für Xcode 9.3
InformationsquelleAutor der Antwort Pooja Gupta