2014-10-27 12 views
9

Ich verwende Xcode 6 und ich habe meine App mit einem UITableView und einem custom Cell darin erstellt. Das ist mein custom cellZugewiesenes Objekt zu schwacher Eigenschaft zuweisen

@interface SuggestingTableViewCell : UITableViewCell 

@property (nonatomic, weak) IBOutlet SuggestedSeriesView *seriesOne; 
@property (nonatomic, weak) IBOutlet SuggestedSeriesView *seriesTwo; 
@property (nonatomic, weak) IBOutlet SuggestedSeriesView *seriesThree; 
@property (nonatomic, weak) IBOutlet SuggestedSeriesView *seriesFour; 

@end 

Wie Sie Ich habe vier IBOutets zu einem SuggestedSeriesView sehen können, dass eine Unterklasse von UIView ist. In den TableView DataSource Methoden habe ich diese SuggestedSeriesView erstellt und ordnen sie mag:

cellIdentifier = suggestionCell; 
SuggestingTableViewCell *suggesting = (SuggestingTableViewCell *)[tableView dequeueReusableCellWithIdentifier:suggestionCell]; 
Series *ser1 = series[0]; 
suggesting.seriesOne = [[SuggestedSeriesView alloc] initWithFrame:suggesting.seriesOne.bounds 
                andSeriesData:@{JV_SERIES_IMAGE_URL : ser1.imageURL, 
                    JV_SERIES_TITLE : ser1.title}]; 
Series *ser2 = series[1]; 
suggesting.seriesTwo = [[SuggestedSeriesView alloc] initWithFrame:suggesting.seriesTwo.bounds 
                andSeriesData:@{JV_SERIES_IMAGE_URL : ser2.imageURL, 
                    JV_SERIES_TITLE : ser2.title}]; 
Series *ser3 = series[2]; 
suggesting.seriesThree = [[SuggestedSeriesView alloc] initWithFrame:suggesting.seriesThree.bounds 
                 andSeriesData:@{JV_SERIES_IMAGE_URL : ser3.imageURL, 
                     JV_SERIES_TITLE : ser3.title}]; 
Series *ser4 = series[3]; 

suggesting.seriesFour = [[SuggestedSeriesView alloc] initWithFrame:suggesting.seriesFour.bounds 
                andSeriesData:@{JV_SERIES_IMAGE_URL : ser4.imageURL, 
                    JV_SERIES_TITLE : ser4.title}]; 

Der Compiler gibt mir die Warnung, dass:

Zuordnung beibehalten Objekt zu schwach Eigentum; Objekt wird nach Zuweisung freigegeben

Warum dies die SuggestedSeriesView wird durch die cell beibehalten geschieht, weil es keine IBOutlet hat?

Danke für die Hilfe.

+1

Nein, ist es nicht und es ist genau der Punkt. Das Zurückhalten geschieht nicht, weil das Zeug "IBOutlet" ist, sondern weil das Zeug "stark" ist. –

Antwort

18

Dies geschieht, weil Ihre Eigenschaften schwach sind, das heißt, sie werden nichts behalten, sie können nur auf Zeug verweisen.

IBOutlet ist gleich void, es ist nur ein Hinweis für xcode, um es zu sagen "Dies kann auf dem Interface Builder verbunden werden".

Der Grund, warum Eigenschaften vom Interface Builder vom Typ weak und IBOutlet sind, liegt daran, dass sie von der View-Controller-Ansicht des Storyboards selbst beibehalten werden. Wenn Sie also einen View-Controller im Interface Builder erstellen und eine View hinzufügen und DANN verknüpfen Sie diese Ansicht im Code, Ihre Eigenschaft muss nicht stark sein, da sie bereits von der einen der Ansichten beibehalten wird.

sollten Sie diese Eigenschaften

@property (nonatomic, strong) SuggestedSeriesView *seriesOne; 
@property (nonatomic, strong) SuggestedSeriesView *seriesTwo; 
@property (nonatomic, strong) SuggestedSeriesView *seriesThree; 
@property (nonatomic, strong) SuggestedSeriesView *seriesFour; 
+4

_ "Sie werden vom View-Controller des Storyboards beibehalten" _ dies ist nicht korrekt. Outlets können schwach sein, weil sie Subviews von etwas sind, und ein Superview behält einen starken Bezug zu seinen Subviews bei. – jrturton

+0

ja du hast recht – Pochi

9

ändern Sie ein Objekt in der gleichen Zeit zu schaffen, wie es zu einer schwachen Eigenschaft zuweisen. An diesem Punkt hat nichts einen starken Bezug darauf, also sollte es gemäß den Regeln von ARC sofort ausgearbeitet werden. (Beachten Sie, dass dies nicht sofort passiert, wenn Debug-Builds ausgeführt werden).

Beim Laden vom Storyboard wird das Objekt erstellt, als Unteransicht hinzugefügt und dann dem Ausgang zugewiesen. Die Superview hat eine starke Referenz, also ist das in Ordnung.

Um dieses Verhalten widerzuspiegeln, ohne den Eigenschaftstyp outlet zu ändern (obwohl es heutzutage nicht viel schadet), sollten Sie Ihr neues Objekt einer lokalen Variablen zuweisen, es zu einer Ansicht hinzufügen und dann zuweisen die Outlet-Eigenschaft.

+0

OK Danke, ich denke, ich werde das Eigenschaftsattribut für jetzt ändern :) – YuviGr

1
@interface SuggestingTableViewCell : UITableViewCell 

@property (nonatomic, weak) IBOutlet SuggestedSeriesView *seriesOne; 

@end 

cellIdentifier = suggestionCell; 

SuggestingTableViewCell *suggesting = (SuggestingTableViewCell *)[tableView dequeueReusableCellWithIdentifier:suggestionCell]; 

Series *ser1 = series[0]; 

SuggestedSeriesView * strongSeriesOne = [[SuggestedSeriesView alloc] initWithFrame:suggesting.seriesOne.bounds andSeriesData:@{JV_SERIES_IMAGE_URL : ser1.imageURL, JV_SERIES_TITLE : ser1.title}]; 

suggesting.seriesOne = strongSeriesOne;