Donc je viens de recevoir cela lors d'une interview aujourd'hui et après que certaines googles sont toujours incapables de comprendre la réponse (en fait, je ne pouvais même trouver aucun code qui a utilisé la méthode [NSString String]).
Quelle est la différence entre p>
nstring * sulsing = [string nstring]; code> li>
-
nsstring * sulsting = [[NSString Alloc] init]; code> li>
ol> Mes pensées initiales étaient que [nstring string] code> retournerait un objet qui serait autorité qui serait autorité, alors que l'utilisation d'ALLOC et init rendrait un objet qui a été retenu. Cependant, il semble que cette réponse était incorrecte. P> J'ai examiné la référence de la classe Nstring dans les documents Apple, mais tout ce qu'il dit est P>
Returns an empty string.
+ (id)string
Return Value
An empty string.
5 Réponses :
Était-ce votre réponse, et avez-vous demandé pourquoi em> votre réponse était incorrecte? Je vous demande parce que votre hypothèse est principalement correcte (à un niveau supérieur). Ce n'est pas exactement "retenu" quand est retourné de Au niveau inférieur, vous pourriez faire des suppositions, mais je ne m'attendais pas à cette question dans de nombreux entretiens de l'OBJC (à moins que vous ne l'ai dit ils vous avez été moyen ou supérieur). Fondamentalement, il s'agit de la mise en œuvre de la mise en œuvre, mais les deux formes peuvent renvoyer la même statique, constante Alloc + init code>, il s'agit d'un objet que vous détenez une référence à une référence et devrait Équilibre avec une version code> code> ou
AutoRelease code>. Pour le constructeur de commodité (
+ [nstring string] code>), vous êtes renvoyé un objet que vous détenez zéro références à, mais que vous pouvez vous attendre à vivre jusqu'à ce que la piscine Autoréleuillet actuelle soit sauf si vous l'envoyez. un retenue explicite (supposant la MRC ou l'arc, puisqu'il est étiqueté iOS). P>
nstring code> (qui a peut-être été ce que l'intervieweur cherchait). Pour illustrer: P>
@implementation NSString
static NSString * const EmptyNSString = @"";
- (id)init
{
self = [super init];
[self release];
return EmptyNSString;
}
+ (id)string
{
return EmptyNSString;
}
...
Merci pour la réponse Justin, je n'ai pas réellement demandé si c'était incorrect car nous courions un peu à l'heure avec l'entretien, mais ils m'ont demandé si j'étais sûr que ma réponse était correcte et m'a dit de regarder la question à nouveau Et je leur ai donné un look perplexe alors nous avons passé.
@Jason ah, d'accord. La question peut donc avoir été répondue de manière satisfaisante, et ils voulaient savoir si vous saviez que l'optimisation que j'ai décrite (ou peut-être autre chose).
@Jeremyp pourquoi pas? ... ou faisiez-vous référence à un point que j'ai clarifié dans une édition?
@Justin: Voir ma réponse pour pourquoi pas. Cependant, sur la relecture de votre réponse, je pense que mon vote à la baisse était dur, alors je l'enlève.
@Jeremyp, il y avait quelques points que j'ai mal formulés sur le chemin et mis à jour après avoir réalisé que ...
Vous ne voyez pas souvent car il est identique à p> qui est plus court. Il est généralement utilisé pour créer une nsmutableString vide p>
Est-ce que ces deux déclarations ont effectivement exactement la même signification, pas de choses drôles qui vont à l'arrière-plan? Je demande parce que je suis curieux de savoir pourquoi la classe Nstring aurait une méthode de chaîne qui ne serait jamais utilisée de manière réaliste?
Notez que la chaîne vide constante renvoyée par + [nstring string] code> n'est pas le même objet que
@ "" code>.
Il est utile dans le cas de NsmutableString * S = [string nsmutableString];
La personne qui a peut-être pu expliquer gentiment expliquer toute circonstance où nsstring * svstring = [string nstring]; se comporte réellement différemment à Nstring * sulsing = @ "";
[NSString String] est une chaîne vide Auteledeledeledeledeledeledeledeledeledeled, de même que @ "" (dans tous les cas, vous pouvez y penser de cette façon, même si "techniquement", "sous la hotte", ce n'est pas le cas, c'est un détail de mise en œuvre).
Ni est autorisé. En outre, votre réponse ne montre pas de bowvote. O_o
Maintenant, mes pensées initiales étaient que
[nstring string] code> retournerait un objet qui serait autoréliquement p> blockQuote>
Techniquement, c'est une chaîne d'espace réservée constante, c'est-à-dire qu'elle vit tout au long de l'exécution du programme, ne jamais être libérée. Ce n'est pas une chaîne automatique. Conceptuellement, et c'est ce que je me concentrerais comme un intervieweur, c'est une chaîne (une chaîne vide) qui n'est pas la propriété de l'appelant, d'où l'appelant ne doit pas la libérer. P>
alors qu'utiliser ALLOC et INIT renvoient un objet qui a été retenu p> blockQuote>
Techniquement, c'est une chaîne d'espace réservée constante, c'est-à-dire qu'elle vit tout au long de l'exécution du programme. En fait, c'est le même objet que celui ci-dessus, et il n'est pas conservé. Conceptuellement, et c'est ce que je me concentrerais comme un intervieweur, c'est une chaîne (une chaîne vide) appartenant à l'appelant, d'où l'appelant est responsable de la libération de la libération de ce qui n'est plus nécessaire. P>
Comme il s'agissait d'une question concernant les entretiens, je vais marquer cela comme la bonne réponse car il semble expliquer ce que la réponse à un intervieweur s'attendrait. Merci bevarieux
La seule chose que je peux imaginer, c'est que: p>
n'alloudra pas la mémoire car elle n'est pas faite avec ALLOC. C'est une constante (une chaîne vide) faite par le système et n'a pas besoin d'être libérée. P> li>
Vous allouez la mémoire pour la NSString vous-même, ce qui signifie que vous devez garder une trace si le Nstring "vit" ou non lorsque vous en avez terminé, et donc besoin de le relâcher. p> li> ol>
Même + [nsstring alloc] code> n'acitez pas la mémoire - il renvoie un espace réservé singleton de type
nsplaceholderstring code>. C'est un modèle commun lors de la mise en œuvre de clusters de classe.
La bonne réponse est que
NSString *someString = [[NSString alloc] init];
Merci pour la réponse Jeremy et me fais savoir sur le drapeau UINT_MAX
@Jason: Le truc uint_max est un détail de mise en œuvre. Vous n'avez pas besoin de savoir à ce sujet normalement.
Oui, je comprends que, mais peut-être que c'est juste une pierre d'animaux de la mienne, mais j'aime savoir sur ces petits détails complexes que vous n'apprenez généralement pas de manuels de lecture
Cela semble un peu injuste si c'est la raison i> la raison pour laquelle vous n'avez pas eu le travail.
Dans iOS5 (avec arc), ils sont les mêmes choses.
@jrturton Ce n'était que l'une des nombreuses questions que j'ai posées, je ne pense pas que ce sera la seule raison de si je passais ou non après cette étape d'entrevue.