Quelqu'un a-t-il un script Xcode pour générer des directives @property et @synthsize pour des variables d'instance dans une classe?Script Xcode pour générer/synthétiser des propriétés
Répondre
J'utilise Accessorizer qui fait cela et beaucoup plus.
http://www.kevincallahan.org/software/accessorizer.html
très bon marché et puissant.
C'est celui que j'ai trouvé sur la base de celui que j'ai trouvé il y a longtemps, réécrit en Python et avec les améliorations qu'il peut générer plusieurs propriétés à la fois, entre autres choses.
Il va générer des propriétés pour toutes les variables d'instance sélectionnées en utilisant (copier) comme attribut. Il existe encore des cas de bordure avec plusieurs @interfaces ou @implementations dans un fichier, ainsi que certains avec des identifiants inhabituels ou un astérisque (comme dans * const), mais ils doivent couvrir les styles de codage les plus courants. N'hésitez pas à modifier/publier des modifications si vous corrigez l'un de ces cas.
#!/usr/bin/python
# Takes a header file with one or more instance variables selected
# and creates properties and synthesize directives for the selected properties.
# Accepts google-style instance variables with a tailing underscore and
# creates an appropriately named property without underscore.
# Entire Document
# Home Directory
# Discard Output
# Display in Alert
import os
import re
import subprocess
# AppleScripts for altering contents of files via Xcode
setFileContentsScript = """\
on run argv
set fileAlias to POSIX file (item 1 of argv)
set newDocText to (item 2 of argv)
tell application "Xcode"
set doc to open fileAlias
set text of doc to newDocText
end tell
end run \
"""
getFileContentsScript = """\
on run argv
set fileAlias to POSIX file (item 1 of argv)
tell application "Xcode"
set doc to open fileAlias
set docText to text of doc
end tell
return docText
end run \
"""
# Get variables from Xcode
headerFileText = """%%%{PBXAllText}%%%"""
selectionStartIndex = %%%{PBXSelectionStart}%%%
selectionEndIndex = %%%{PBXSelectionEnd}%%%
selectedText = headerFileText[selectionStartIndex:selectionEndIndex]
headerFilePath = """%%%{PBXFilePath}%%%"""
# Look for an implementation file with .m or .mm extension
implementationFilePath = headerFilePath[:-1] + "m"
if not os.path.exists(implementationFilePath):
implementationFilePath += "m"
instanceVariablesRegex = re.compile(
"""^\s*((?:(?:\w+)\s+)*(?:(?:\w+)))""" + # Identifier(s)
"""([*]?)\\s*""" + # An optional asterisk
"""(\\w+?)(_?);""", # The variable name
re.M)
# Now for each instance variable in the selected section
properties = ""
synthesizes = ""
for lineMatch in instanceVariablesRegex.findall(selectedText):
types = " ".join(lineMatch[0].split()) # Clean up consequtive whitespace
asterisk = lineMatch[1]
variableName = lineMatch[2]
trailingUnderscore = lineMatch[3]
pointerPropertyAttributes = "(copy) " # Attributes if variable is pointer
if not asterisk:
pointerPropertyAttributes = ""
newProperty = "@property %s%s %s%s;\n" % (pointerPropertyAttributes,
types,
asterisk,
variableName)
# If there's a trailing underscore, we need to let the synthesize
# know which backing variable it's using
newSynthesize = "@synthesize %s%s;\n" % (variableName,
trailingUnderscore and
" = %s_" % variableName)
properties += newProperty
synthesizes += newSynthesize
# Check to make sure at least 1 properties was found to generate
if not properties:
os.sys.stderr.writelines("No properties found to generate")
exit(-1)
# We want to insert the new properties either immediately after the last
# existing property or at the end of the instance variable section
findLastPropertyRegex = re.compile("^@interface.*?{.*?}.*?\\n" +
"(?:.*^\\s*@property.*?\\n)?", re.M | re.S)
headerInsertIndex = findLastPropertyRegex.search(headerFileText).end()
# Add new lines on either side if this is the only property in the file
addedNewLine = "\n"
if re.search("^\s*@property", headerFileText, re.M):
# Not the only property, don't add
addedNewLine = ""
newHeaderFileText = "%s%s%s%s" % (headerFileText[:headerInsertIndex],
addedNewLine,
properties,
headerFileText[headerInsertIndex:])
subprocess.call(["osascript",
"-e",
setFileContentsScript,
headerFilePath,
newHeaderFileText])
if not os.path.exists(implementationFilePath):
os.sys.stdout.writelines("No implementation file found")
exit(0)
implementationFileText = subprocess.Popen(
["osascript",
"-e",
getFileContentsScript,
implementationFilePath],
stdout=subprocess.PIPE).communicate()[0]
# We want to insert the synthesizes either immediately after the last existing
# @synthesize or after the @implementation directive
lastSynthesizeRegex = re.compile("^\\s*@implementation.*?\\n" +
"(?:.*^\\s*@synthesize.*?\\n)?", re.M | re.S)
implementationInsertIndex = \
lastSynthesizeRegex.search(implementationFileText).end()
# Add new lines on either side if this is the only synthesize in the file
addedNewLine = "\n"
if re.search("^\s*@synthesize", implementationFileText, re.M):
# Not the only synthesize, don't add
addedNewLine = ""
newImplementationFileText = "%s%s%s%s" % \
(implementationFileText[:implementationInsertIndex],
addedNewLine,
synthesizes,
implementationFileText[implementationInsertIndex:])
subprocess.call(["osascript",
"-e",
setFileContentsScript,
implementationFilePath,
newImplementationFileText])
# Switch Xcode back to header file
subprocess.Popen(["osascript",
"-e",
getFileContentsScript,
headerFilePath],
stdout=subprocess.PIPE).communicate()
Euh, non "synthétiser", avec deux e? Je suppose que ce script ne peut pas fonctionner correctement avec l'orthographe "synthsize". – n8gray
Oui, merci d'avoir signalé cela. –
En voici un que j'ai écrit hier pour faire les directives @property avant de rencontrer cette question quelques heures plus tard. C'est un simple filtre de texte et il serait trivial de l'étendre aux directives @synthesize (ajouter une clause when
appropriée à l'instruction case
et apporter les ajouts appropriés à la condition when block_end
), et pas beaucoup de travail pour l'étendre pour gérer plusieurs occurrences de @ Interface/implémentation @ dans un fichier (en suivant leurs noms --- il peut être fait par la capture d'expressions rationnelles, comme tout le reste dans le script):
#! /usr/bin/ruby
# -------------- Basic Definitions -----------------------------
doc = "%%%{PBXFilePath}%%%"
# regular expressions
search_exp = /[[:space:]]*([[a-zA-Z0-9]]*)[[:space:]]\*([a-zA-Z0-9]*)/
interface_start = /@interface/
block_end = /^\}/
#initializing variables
properties_list = []
properties_string = ""
reading_interface = 0
#---------------- Start Processing -----------------------------
file = File.open(doc, "r").readlines
file.each do |line|
# capture the regular expression matches only in the
# interface declaration and print out the matching
# property declarations
case line
# start capturing
when interface_start
reading_interface = 1
puts line
# capture and keep in properties_list
when search_exp
if (reading_interface == 1) then
data = Regexp.last_match
properties_list << data
end
puts line
# unpack properties_list and print out the property
# declarations
when block_end
if (reading_interface == 1) then
reading_interface = 0
properties_list.each do |pair|
properties_string << "@property (readwrite, copy) #{pair[0].lstrip};\n"
end
puts line
puts "\n" + properties_string
end
else puts line
end
end
Je lance cela en utilisant « pas d'entrée » et « remplacer contenu du document "en tant qu'options d'E/S dans l'éditeur de scripts utilisateur.
Voici l'usercript que j'utilise actuellement - il fonctionne sur une variable d'instance à la fois. Il essaie d'utiliser le bon mécanisme de rétention (les types simples ne sont pas conservés), et il crée également l'instruction @synthesize dans le fichier d'implémentation - actuellement, il ne crée pas encore d'instructions dealloc pour vous.
#! /usr/bin/perl -w
#Input: Selection
#Directory: Selection
#Output: Display in Alert
#Errors: Display in Alert
use strict;
# Get the header file contents from Xcode user scripts
my $headerFileContents = <<'HEADERFILECONTENTS';
%%%{PBXAllText}%%%
HEADERFILECONTENTS
# Get the indices of the selection from Xcode user scripts
my $selectionStartIndex = %%%{PBXSelectionStart}%%%;
my $selectionEndIndex = %%%{PBXSelectionEnd}%%%;
# Get path of the header file
my $implementationFilePath = "%%%{PBXFilePath}%%%";
my $headerFilePath = $implementationFilePath;
# Look for an implemenation file with a ".m" or ".mm" extension
$implementationFilePath =~ s/\.[hm]*$/.m/;
if (!(-e $implementationFilePath))
{
$implementationFilePath =~ s/.m$/.mm/;
}
# Handle subroutine to trime whitespace off both ends of a string
sub trim
{
my $string = shift;
$string =~ s/^\s*(.*?)\s*$/$1/;
return $string;
}
# Get the selection out of the header file
my $selectedText = substr $headerFileContents, $selectionStartIndex, ($selectionEndIndex - $selectionStartIndex);
#my $otherText = substr $headerFileContents, $selectionStartIndex;
#my $pulledText = "";
#if (length($otherText) && $otherText =~ /.*$(^.*;).*/)
#{
# $pulledText = $1;
#}
#
#
#print $pulledText;
$selectedText = trim $selectedText;
my $type = "";
my $asterisk = "";
my $name = "";
my $behavior = "";
my $iboutlet = "";
# Test that the selection is:
# At series of identifiers (the type name and access specifiers)
# Possibly an asterisk
# Another identifier (the variable name)
# A semi-colon
if (length($selectedText) && ($selectedText =~ /([_A-Za-z][_A-Za-z0-9]*\s*)+([\s\*]+)([_A-Za-z][_A-Za-z0-9]*)/))
{
$type = $1;
$type = trim $type;
$asterisk = $2;
$asterisk = trim $asterisk;
$name = $3;
$behavior = "";
if (defined($asterisk) && length($asterisk) == 1)
{
$behavior = "(nonatomic, retain) ";
}
else
{
$behavior = "(nonatomic) ";
$asterisk = "";
}
}
else
{
print "Bailing, error in Regex";
exit 1;
}
# special case, see if we need to keep around an IBOUTLET declaration.
if (length($selectedText) && ($selectedText =~ /IBOutlet/))
{
$iboutlet = "IBOutlet ";
}
# Find the closing brace (end of the class variables section)
my $remainderOfHeader = substr $headerFileContents, $selectionEndIndex;
my $indexAfterClosingBrace = $selectionEndIndex + index($remainderOfHeader, "\n}\n") + 3;
if ($indexAfterClosingBrace == -1)
{
exit 1;
}
# Determine if we need to add a newline in front of the property declaration
my $leadingNewline = "\n";
if (substr($headerFileContents, $indexAfterClosingBrace, 1) eq "\n")
{
$indexAfterClosingBrace += 1;
$leadingNewline = "";
}
# Determine if we need to add a newline after the property declaration
my $trailingNewline = "\n";
if (substr($headerFileContents, $indexAfterClosingBrace, 9) eq "\@property")
{
$trailingNewline = "";
}
# Create and insert the proper declaration
my $propertyDeclaration = $leadingNewline . "\@property " . $behavior . $iboutlet . $type . " " . $asterisk . $name . ";\n" . $trailingNewline;
substr($headerFileContents, $indexAfterClosingBrace, 0) = $propertyDeclaration;
my $replaceFileContentsScript = <<'REPLACEFILESCRIPT';
on run argv
set fileAlias to POSIX file (item 1 of argv)
set newDocText to (item 2 of argv)
tell application "Xcode"
set doc to open fileAlias
set text of doc to newDocText
end tell
end run
REPLACEFILESCRIPT
# Use Applescript to replace the contents of the header file
# (I could have used the "Output" of the Xcode user script instead)
system 'osascript', '-e', $replaceFileContentsScript, $headerFilePath, $headerFileContents;
# Stop now if the implementation file can't be found
if (!(-e $implementationFilePath))
{
exit 1;
}
my $getFileContentsScript = <<'GETFILESCRIPT';
on run argv
set fileAlias to POSIX file (item 1 of argv)
tell application "Xcode"
set doc to open fileAlias
set docText to text of doc
end tell
return docText
end run
GETFILESCRIPT
# Get the contents of the implmentation file
open(SCRIPTFILE, '-|') || exec 'osascript', '-e', $getFileContentsScript, $implementationFilePath;
my $implementationFileContents = do {local $/; <SCRIPTFILE>};
close(SCRIPTFILE);
# Look for the class implementation statement
if (length($implementationFileContents) && ($implementationFileContents =~ /(\@implementation [_A-Za-z][_A-Za-z0-9]*\n)/))
{
my $matchString = $1;
my $indexAfterMatch = index($implementationFileContents, $matchString) + length($matchString);
# Determine if we want a newline before the synthesize statement
$leadingNewline = "\n";
if (substr($implementationFileContents, $indexAfterMatch, 1) eq "\n")
{
$indexAfterMatch += 1;
$leadingNewline = "";
}
# Determine if we want a newline after the synthesize statement
$trailingNewline = "\n";
if (substr($implementationFileContents, $indexAfterMatch, 11) eq "\@synthesize")
{
$trailingNewline = "";
}
# Create and insert the synthesize statement
my $synthesizeStatement = $leadingNewline . "\@synthesize " . $name . ";\n" . $trailingNewline;
substr($implementationFileContents, $indexAfterMatch, 0) = $synthesizeStatement;
# Use Applescript to replace the contents of the implementation file in Xcode
system 'osascript', '-e', $replaceFileContentsScript, $implementationFilePath, $implementationFileContents;
}
exit 0;
Accessorizer http://www.kevincallahan.org/software/accessorizer.html fait ce genre de choses et beaucoup plus. Il gère également les préfixes et postfixes personnalisés (suffixes). Si vous voulez le soulignement de Google, vous l'avez. Si vous voulez le changer, changez-le à la volée - pas besoin de modifier les scripts. En outre, il existe une table par défaut dans laquelle vous pouvez définir des spécificateurs de propriété par défaut en fonction du type d'ivar transmis (copier, conserver, en lecture seule, assigner, etc.). Il fait la détection IBOutlet et insère automatiquement le mot-clé IBOutlet, nils vos vues pour -viewDidUnload, fait plusieurs styles de dealloc. Il écrit également tous ces accesseurs velus pour les collections (NSMutableArray et NSSet). Il permet l'archivage des clés, diverses approches de verrouillage, il peut trier votre propriété et synthétiser des blocs, écrire du code KVO, du code Singleton, convertir en sélecteur, générer des tags HeaderDoc, NSLog() et plus ... Il a aussi un onglet styles flexibles pour mettre les accolades sur newline ou non, pour l'espacement, pour les noms d'arguments personnalisés etc. La plupart des choses sont traitées par les Services, donc vous sélectionnez simplement votre bloc ivar, appuyez sur une touche ou deux et vous avez terminé. Si vous réduisez Accessorizer au dock, son interface ne vient pas au premier plan, vous permettant de rester concentré sur Xcode ou tout autre éditeur supportant les services. Bien sûr, Accessorizer écrit également des accesseurs explicites (comme dans Objective-C 1.0) et vous permet de surcharger les propriétés - le tout avec un simple basculement d'un commutateur. Vous pouvez même personnaliser le remplacement en fonction du type transmis. Regardez les vidéos pour les voir en action.
Ceci est un script python pour Xcode 3.2.4 qui génère; propriétés de l'interface, synthèse de l'implémentation et dealloc. Pour installer, copiez ce script, allez dans le menu des scripts Xcode (avant-dernier) "Modifier les scripts utilisateur ..." Ajoutez-le sous Code, créez un nouveau nom de script et collez le script python ci-dessous. Pour utiliser simplement les variables sous l'interface @, appelez ce script. Il ajoutera alors toutes les propriétés @, dans l'implémentation et tous les @synthesize et dealloc. Il ne sera pas ajouter IBOutlet à l'un de vos étiquettes ou boutons, car il ne le sait pas, mais ce est facile à ajouter manuellement.
L'indentation du script ci-dessous est critique donc ne le changez pas.
#!/usr/bin/python
# Takes a header file with one or more instance variables selected
# and creates properties and synthesize directives for the selected properties.
# Accepts google-style instance variables with a tailing underscore and
# creates an appropriately named property without underscore.
# Xcode script options should be as follows:
# Entire Document
# Home Directory
# Discard Output
# Display in Alert
import os
import re
import subprocess
# AppleScripts for altering contents of files via Xcode
setFileContentsScript = """\
on run argv
set fileAlias to POSIX file (item 1 of argv)
set newDocText to (item 2 of argv)
tell application "Xcode"
set doc to open fileAlias
set text of doc to newDocText
end tell
end run \
"""
getFileContentsScript = """\
on run argv
set fileAlias to POSIX file (item 1 of argv)
tell application "Xcode"
set doc to open fileAlias
set docText to text of doc
end tell
return docText
end run \
"""
# Get variables from Xcode
headerFileText = """%%%{PBXAllText}%%%"""
selectionStartIndex = %%%{PBXSelectionStart}%%%
selectionEndIndex = %%%{PBXSelectionEnd}%%%
selectedText = headerFileText[selectionStartIndex:selectionEndIndex]
headerFilePath = """%%%{PBXFilePath}%%%"""
# Look for an implementation file with .m or .mm extension
implementationFilePath = headerFilePath[:-1] + "m"
if not os.path.exists(implementationFilePath):
implementationFilePath += "m"
instanceVariablesRegex = re.compile(
"""^\s*((?:(?:\\b\w+\\b)\s+)*(?:(?:\\b\\w+\\b)))\\s*""" + # Identifier(s)
"""([*]?)\\s*""" + # An optional asterisk
"""(\\b\\w+?)(_?\\b);""", # The variable name
re.M)
# Now for each instance variable in the selected section
properties = ""
synthesizes = ""
deallocs = ""
for lineMatch in instanceVariablesRegex.findall(selectedText):
types = " ".join(lineMatch[0].split()) # Clean up consequtive whitespace
asterisk = lineMatch[1]
variableName = lineMatch[2]
trailingUnderscore = lineMatch[3]
pointerPropertyAttributes = "(nonatomic, retain) " # Attributes if variable is pointer
if not asterisk:
pointerPropertyAttributes = "(nonatomic, assign) "
newProperty = "@property %s%s %s%s;\n" % (pointerPropertyAttributes,
types,
asterisk,
variableName)
# If there's a trailing underscore, we need to let the synthesize
# know which backing variable it's using
newSynthesize = "@synthesize %s%s;\n" % (variableName,
trailingUnderscore and
" = %s_" % variableName)
# only do the objects
if asterisk:
newDealloc = " [%s%s release];\n" % (variableName,
trailingUnderscore and
" = %s_" % variableName)
properties += newProperty
synthesizes += newSynthesize
# only add if it's an object
if asterisk:
deallocs += newDealloc
# Check to make sure at least 1 properties was found to generate
if not properties:
os.sys.stderr.writelines("No properties found to generate")
exit(-1)
# We want to insert the new properties either immediately after the last
# existing property or at the end of the instance variable section
findLastPropertyRegex = re.compile("^@interface.*?{.*?}.*?\\n" +
"(?:.*^\\s*@property.*?\\n)?", re.M | re.S)
headerInsertIndex = findLastPropertyRegex.search(headerFileText).end()
# Add new lines on either side if this is the only property in the file
addedNewLine = "\n"
if re.search("^\s*@property", headerFileText, re.M):
# Not the only property, don't add
addedNewLine = ""
newHeaderFileText = "%s%s%s%s" % (headerFileText[:headerInsertIndex],
addedNewLine,
properties,
headerFileText[headerInsertIndex:])
subprocess.call(["osascript",
"-e",
setFileContentsScript,
headerFilePath,
newHeaderFileText])
if not os.path.exists(implementationFilePath):
os.sys.stdout.writelines("No implementation file found")
exit(0)
implementationFileText = subprocess.Popen(
["osascript",
"-e",
getFileContentsScript,
implementationFilePath],
stdout=subprocess.PIPE).communicate()[0]
# We want to insert the synthesizes either immediately after the last existing
# @synthesize or after the @implementation directive
lastSynthesizeRegex = re.compile("^\\s*@implementation.*?\\n" +
"(?:.*^\\s*@synthesize.*?\\n)?", re.M | re.S)
implementationInsertIndex = \
lastSynthesizeRegex.search(implementationFileText).end()
# Add new lines on either side if this is the only synthsize in the file
addedNewLine = "\n"
if re.search("^\s*@synthesize", implementationFileText, re.M):
# Not the only synthesize, don't add
addedNewLine = ""
newImplementationFileText = "%s%s%s%s" % \
(implementationFileText[:implementationInsertIndex],
addedNewLine,
synthesizes,
implementationFileText[implementationInsertIndex:])
subprocess.call(["osascript",
"-e",
setFileContentsScript,
implementationFilePath,
newImplementationFileText])
implementationFileText = subprocess.Popen(
["osascript",
"-e",
getFileContentsScript,
implementationFilePath],
stdout=subprocess.PIPE).communicate()[0]
# We want to insert the deallocs either immediately after the last existing
# [* release] or after the [super dealloc]
lastDeallocRegex = re.compile("^\\s+\[super dealloc\];?\\n" +
"(?:.*^\\s+\[\w release\];?\\n)?", re.M | re.S)
deallocInsertIndex = \
lastDeallocRegex.search(implementationFileText).end()
addedNewDeallocLine = "\n"
if re.search("^\s*\[\w release\];?", implementationFileText, re.M):
# Not the only dealloc, don't add
addedNewDeallocLine = ""
newImplementationFileText = "%s%s%s%s" % \
(implementationFileText[:deallocInsertIndex],
addedNewDeallocLine,
deallocs,
implementationFileText[deallocInsertIndex:])
subprocess.call(["osascript",
"-e",
setFileContentsScript,
implementationFilePath,
newImplementationFileText])
# Switch Xcode back to header file
subprocess.Popen(["osascript",
"-e",
getFileContentsScript,
headerFilePath],
stdout=subprocess.PIPE).communicate()
Whoa, il y a beaucoup de scripts fous ici.
À partir de Xcode 4.4 (peut-être avant) ... Vos IVAR
s seront synthétisés automatiquement .. Par exemple ..
@property (assign) BOOL automatically;
@property (strong) NSArray *believeDat;
peut être "accessored" via
self.automatically = YES;
et éditer la variable d'instance directement via le caractère de soulignement auto-généré-avec-premier-chef comme ..
_believeDat = @["thank you, jesus", @"mary poopins"];
@synthesize
nécessaire. En ce qui concerne la saisie rapide et facile de tels @property
... faites glisser les éléments suivants, un à la fois, dans la bibliothèque "Code Snippet" .. et vous pouvez assigner des raccourcis clavier pour insérer ces points de saut pour entrer dans la bibliothèque. propriétés plus rapidement. J'utilise rrr pour les objets et aaa pour les primitives .. mais c'est juste moi ..
@property (nonatomic, assign) <#type#> <#name#>;
@property (nonatomic, retain) <#type#> *<#name#>;
last but not least, et certains peuvent me appeler fou .. mais je jette les macros suivantes dans mon .pch
pour accélérer, clarifier, et apporter la concision bienvenue au processus .. toutes les exonérations de macro communes s'appliquent ...
#define RONLY readonly
#define RDWRT readwrite
#define NATOM nonatomic
#define STRNG strong
#define ASS assign
#define CP copy
#define SET setter
#define GET getter
avec #define
structure similaire s pour les classes d'Apple (#define NSA NSArray \ #define NSS NSString
), cela rend les choses plus faciles à lire, et plus rapide à entrer (pour moi), ressemblant à ...
@property (NATOM, STRNG) NSA* fonts;
@property (NATOM, STRNG) NSS* cachedPath;
Donc, vous voulez dire que tous @property ont synthétisé automatiquement? Pas besoin de définir synthétiser? – Dejell
- 1. méthodes d'implémentation pour interfacer le script xcode
- 2. Modification d'une phase de construction de script d'exécution dans XCode
- 3. Comment inclure le langage de script lua dans C++ XCode?
- 4. Existe-t-il un moyen plus simple d'ajouter des propriétés à une classe dans XCode?
- 5. Utilisation des propriétés pour les types primitifs
- 6. Insérer des parenthèses correspondantes xcode?
- 7. faire des graphiques avec xCode
- 8. Réinitialisation des propriétés d'une grille de propriétés
- 9. Variables Xcode
- 10. Surveillance des variables dans Xcode
- 11. Comment faire pour que XCode exécute Script Build Phase s'exécute si la construction brise?
- 12. Comment créer des projets hybrides Xcode pour Mac et iPhone?
- 13. Intégration continue pour iphone xcode
- 14. Rails: Script pour importer des données
- 15. Script pour la gestion des dossiers
- 16. Xcode: Garbage Collector Setting
- 17. Accessibilité des propriétés abstraites
- 18. Hériter des propriétés css
- 19. variables comme des propriétés en JavaScript
- 20. script pour ajouter des fichiers à SVN avec des filtres
- 21. compilez des fichiers non-source dans Xcode
- 22. Que se passe lorsque vous effectuez des tâches à des champs ou des propriétés des propriétés
- 23. XCode Différentes ressources pour différentes cibles
- 24. Où trouver les descriptions des balises (X) HTML et des propriétés CSS? (pour l'application d'analyse syntaxique)
- 25. Compilation pour l'iPhone 2.2.1 en utilisant Xcode
- 26. Puis-je avoir Xcode pour Leopard encore?
- 27. LINQ to SQL: propriétés des propriétés qui peuvent être null
- 28. Modification des propriétés Active Directory
- 29. Comment supprimer des points d'arrêt dans XCode
- 30. Comment tuer des boucles dans Xcode?
Merci pour la suggestion - Je vais jeter un coup d'oeil. –