9
votes

Affectation d'un objet retenu à une propriété faible

J'utilise xcode 6 fort> et j'ai créé mon application avec un utableview code> et a cellule personnalisée code> dedans. Ceci est mon personnalisé cellule code> xxx pré>

Comme vous pouvez le voir, j'ai quatre iboutets code> à un suggesteDSeriesView code> qui est une sous-classe de uiview code>. Dans le TableView DataSource Code> Méthodes J'ai créé ces SuggesececedSeriesView Attribuez-les comme: P>

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}];


1 commentaires

Non, ce n'est pas et c'est exactement le point. Le retenue ne se produit pas parce que des choses sont iboutlet mais parce que des choses sont fort .


3 Réponses :


19
votes

Cela se produit parce que vos propriétés sont faibles, cela signifie qu'elles ne conserveront rien, ils ne peuvent que faire référence, ils ne peuvent que faire référence.

iboutlet est égal à vide, il ne s'agit que d'un indice de Xcode pour le dire "Ceci peut être connecté sur Le constructeur d'interface ".

La raison pour laquelle les propriétés du constructeur d'interface sont de type faible et Iboutlet est parce que, ils sont retenus par la vue du contrôleur d'affichage du storyboard, donc si vous faites un contrôleur d'affichage dans l'interface Constructeur, et ajoutez une vue, puis liez cette vue en code Votre propriété ne doit pas être forte, car elle est déjà conservée par l'une des vues.

Vous devez modifier ces propriétés à xxx


1 commentaires

"Ils sont retenus par le contrôleur d'affichage du scénario" Ce n'est pas correct. Les points de vente peuvent être faibles car ils sont des sous-visions de quelque chose et une vue superview conserve une référence forte à ses sous-espoirs.



10
votes

Vous créez un objet en même temps que vous l'attribuez à une propriété faible. À ce stade, rien n'a une forte référence à cela, de sorte que les règles de l'arc devraient être immédiatement nulsées. (Note que lorsque vous utilisez des constructions de débogage, cela ne se produit pas immédiatement).

Lors du chargement à partir du storyboard, l'objet est créé, ajouté en tant que sous-View et puis attribué à la prise. Le superview a une référence forte, donc c'est bien.

Pour refléter ce comportement sans changer votre type de propriété de sortie (cependant pour être honnête, il n'y a pas beaucoup de mal à cela) Vous devez affecter votre nouvel objet à une variable locale, puis l'ajouter à une vue, puis attribuez-la à la propriété de sortie.


1 commentaires

Ok merci, je pense que je vais changer l'attribut de la propriété pour l'instant :)



1
votes
@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;

0 commentaires