Block bewahrt implizit 'self'; Erwähnen Sie explizit "selbst", um anzugeben, dass dies beabsichtigt ist

14

Gegeben ist Folgendes:

%Vor%

Wo myTimer in einer privaten Schnittstelle deklariert ist:

%Vor%

Wie könnte man die folgende Warnung beheben:

%Vor%

Nach dem, was ich bisher gefunden habe, beinhalten die meisten Vorschläge etwas wie:

%Vor%

Außer, dass myTimer ein ivar ist, was bedeutet, dass wself keinen Zugriff auf Eigenschaften hat.

Ich denke, meine Fragen sind:

  1. Mache ich das?
  2. Soll ich myTimer als Eigentum deklarieren?

Ich benutze Ivars ziemlich viel durch meinen Code. Ich habe meinem Projekt nur die -Weverything -Flag hinzugefügt, um zu sehen, ob ich irgendwelche zugrunde liegenden Probleme finden kann, und dies ist bei weitem die häufigste Warnung. Ich habe kein Problem damit, es zu beheben und es zu beheben, indem ich meine Ivars Eigenschaften mache, aber ich möchte sicherstellen, dass ich ein besseres Verständnis bekomme, bevor ich das tue.

    
Kyle 05.02.2014, 12:45
quelle

4 Antworten

12

Das Ersetzen von myTimer by self->myTimer würde Ihre Warnung beheben.

Wenn Sie einen iVar _iVar im Code verwenden, ersetzt der Compiler den Code durch self->_iVar , und wenn Sie ihn innerhalb eines Blocks verwenden, erfasst der Block self anstelle des iVar selbst. Die Warnung soll nur sicherstellen, dass der Entwickler dieses Verhalten versteht.

    
bsarr007 05.02.2014, 12:51
quelle
20

Details

Xcode: 9.2

Warnungen in Objective-C-Pods

Ich habe ein schnelles Projekt. Warnung Block implicitly retains 'self'; explicitly mention 'self' to indicate this is intended behavior erscheint, wenn ich Objective-C-Pods verwende:

  • Schrauben
  • FBSDKCoreKit
  • FBSDKLoginKit

Lösung 1 (manuell)

%Vor%

Lösung 2 (automatisch)

  

Fügen Sie am Ende Ihrer Poddatei hinzu:

%Vor%

Ergebnisse

    
Vasily Bodnarchuk 28.02.2018 11:50
quelle
1

In letzter Zeit stand ich demselben Problem gegenüber und @Vasily Bodnarchuks Antwort scheint hilfreich zu sein.

In Umgebungen mit kontinuierlicher Integration ist es jedoch nicht möglich, das Flag CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF zur Laufzeit in NO zu ändern. Um das Problem zu isolieren, habe ich versucht, alle von Cocoapods installierten abhängigen GEMS zu überprüfen und herausgefunden, dass die Version 1.5.7 von edge XCODEPROJ die CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF auf YES setzt, wann immer der Befehl pod install ausgeführt wird. Die Lösung hierfür ist das Zurücksetzen des XCODEPROJ auf frühere Version 1.5.1 durch Ausführen von sudo gem install xcodeproj -v 1.5.1 . Einmal zurückgesetzt, führe einfach pod install aus und das Flag wird immer auf NO gesetzt.

    
bhuvan 29.03.2018 13:23
quelle
0

Wenn Sie diese Warnungen wegen Bolts / FBSDKCoreKit / FBSDKLoginKit erhalten, sollten Sie Vasilys Antwort vermeiden und stattdessen die Warnungen für diese spezifischen Abhängigkeiten stummschalten.

Option 1

Erwähnen Sie die einzelnen Pods anstatt nur FacebookCore und fügen Sie inhibit_warnings: true

hinzu %Vor%

Option 2

Oder stoppe alle Pods, indem du deinem Podfile folgendes hinzufügst:

%Vor%

Fazit

Sie erhalten immer noch Warnungen für Ihren eigenen Code. Wenn du das nächste Mal den Facebook sdk aktualisierst, sieh dir an, ob du inhibit_warnings: true oder inhibit_all_warnings! entfernen kannst.

    
Nycen 31.03.2018 14:33
quelle