Dans mon application, j'ai une version personnalisée d'Uicollectionview (je l'ai écrite avant que Uicollectionvievievievievievievievievieviee, et il semble être plus performant que l'UICollectionview pour mon cas d'utilisation). Il se compose de plusieurs carreaux dans une vision de ScrollView.
Pour faciliter les performances de défilement, et que chaque carreau consiste en une douzaine de PNGS les uns sur les autres, chaque carreau est pré-rendue à une nscache à l'aide de nsoperations et de nsopération. Sans cette optimisation, la performance de défilement est terrible. P>
ainsi que plusieurs PNGS, chaque carreau a (ou peut avoir) quelques pièces de texte. P>
Chaque nsopération, pour éviter de causer des problèmes de rendu sur un thread de fond (bien sûr, est un uikit no-non), utilise Coregraphics et Nsattributedstrings pour rendre l'image. P>
Cela m'amène à l'accident. Le crash (ci-dessous) semble se rapporter au rendu de Nsattributedstring. Comme ce nsoperationQueue rempli d'opérations de rendu de carreaux est le seul endroit dans mon application qui utilise Nsattributedstrings, et s'appelle beaucoup, je dois supposer que c'est le coupable. Nous voyons que le crash se produisait raisonnablement souvent dans notre collision rapportant, mais pas assez souvent que nous avons un espoir de la reproduire de manière fiable en interne (notre application a une combinaison d'utilisateurs assez massive). P>
fascinant, le crash seulement Se produit sur iOS 7. Quelqu'un a des idées? Voici un exemple de crash: p> voici le code: p> et dans un endroit différent de la même classe : p>
3 Réponses :
La première chose à laquelle je vois est que votre Cette propriété contient le rayon de flou, tel que mesuré dans l'espace de coordonnée de l'utilisateur par défaut. Une valeur de 0 indique pas de flou, tandis que les valeurs plus grandes produisent une floue plus grande plus grande. La valeur par défaut est 0. p>
blockQuote>
Je voudrais essayer de la définir avec une valeur non nulle et voir s'il corrige votre crash. p> shadowblurrradius code> n'est pas défini. Les états manuels: p>
UnBlurradius de 0 est complètement légal. Il est fréquemment utilisé avec un décalage non-0 pour faire une ombre légère ou un effet encastré.
Assurez-vous que vous n'ajoutez pas d'étiquette, changeant du texte dans l'étiquette ou du texte de dessin sur un fil autre que le fil principal. Tandis que le Documentation dit ce qui suit : p>
NstextStorage, NslayoutManager et NstextContainer sont accessibles des sous-titres tant que l'application garantit l'accès d'un seul Fil. P> blockQuote>
J'ai trouvé dans le passé qu'elles ne sont pas entièrement en sécurité et que certaines opérations liées au glyphe doivent se produire sur le fil principal et produiront une exception ou un crash avec un
exc_bad_access code> si elles ne le sont pas. Bien que ce ne soit pas exactement comme votre rapport d'accident, il s'agit d'une cause possible de l'accident. P>
Pour exclure le fil de fil de croix Saisissez comme un problème, envoiez votre appel à -DrawatPoint: code> sur la file d'attente principale.
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:unreadChats attributes:attributes];
dispatch_async(dispatch_get_main_queue(), ^{
[attributedString drawAtPoint: labelPosition];
});
Peut-on voir
-unreadchatlabelfont code> et
-DisplayNamefont code>?
- [NslayoutManager _DrawlineForGlyPrange: Type: BaselineOffset: LineFragmentRect: LigneFraGmyPran GE: Conterorigin: I Sstrikethrough:] Code> est une méthode assez énorme, donc cela pourrait vraiment être n'importe où, mais la branche qui contient une compensation 3358 appelle plusieurs méthodes d'instance UIFONT.
Spécifiquement,
descender code>,
_leading code>,
Sous-litethickness code>,
isvertical code>,
ascendender code>. Vous n'êtes pas sous-classement
uifont code>, remplace ceux-ci et faire quelque chose d'insensé, non?
Malheureusement, ces méthodes ne contiennent rien d'autre que de retourner [Uifont Boldsystemfontofsize: 11] ou retourner [Uifont SystemFontOffre: 12].
Eh bien, c'était un coup long;) Donc, je viens de remarquer ceci: "Chaque nsopération, d'éviter de causer des problèmes de rendu sur un fil de fond (bien sûr, est un uikit no-non), utilise Coregraphics et Nsattributedstrings rendre l'image. ". Nsattributedstring n'est qu'une classe de stockage. Si vous utilisez --DrawatPoint: ou -DrawinRect :, ou si votre NSATTRIBUEDUBUMER contient des classes uikit, vous utilisez toujours Uikit. Bien que le dessin Uikit soit supposé être fait du fil de sécurité dans IOS 4, le système de texte de l'IOS 7 est totalement nouveau et ne me surprendrait pas s'il a des bugs de sécurité.
@iccir je suis d'accord avec vous. J'ai également rencontré des exceptions levées lorsque vous faites des choses avec NslayoutManager sur un fil autre que le fil principal. Il ne se produit pas tout le temps, mais dans certains cas, il posera une exception, indiquant explicitement qu'il ne doit pas être appelé sur un fil de fond.
Pour les documents de référence IOS: "NLayoutManager, NstextextOrage et NstextContainer sont accessibles à partir de sous-organes tant que l'application garantit l'accès d'un seul fil." Voir aussi Apple.com/Library/mac/documentation/cocoa/conceptual/TextLay Out / concepts / layout ANAGER.HTML. Même si c'est un document OS X DOC, le code NSLayoutManager de iOS est dérivé de la version OS X
L'accident est dans le code de dessin pour un Uilabel, et non dans un code Nsattributedstring, vous avez ... Avez-vous une sous-classe Uilabel, ou est-ce que cela complètement uikit? Je ne suis pas sûr que le code que vous avez posté a quelque chose à voir avec le crash, sauf si vous définissez cela attribué fort sur l'étiquette qui se bloque. Il n'est pas surprenant que c'était uniquement iOS7, car le rendu de Nsattributedstring a complètement changé et que NslayoutTmanager n'existait pas avant iOS7. Le premier emploi pour cet accident est d'essayer de déterminer quel Uilabel se bloque et voyez s'il y a quelque chose de non-standard à ce sujet.
Avez-vous essayé de transmettre l'appel à
-DrawatPoint: code> sur la file d'attente principale de votre nsopération? Si cela éliminait le problème, il semblerait confirmer ce que @iccir a dit.
@RYANR HM, oui cela pourrait être. Par le backtrage, il est possible que Nsattributedstring conserve un NslayoutManager partagé pour être utilisé dans son dessin et appeler le dessinateur: dans votre propre thread pourrait gâcher l'uilabel régulier, etc. Dessin dans le fil principal.