2010-06-14 3 views
2

J'ai une application à base de données de base pour iPhone et je reçois l'avertissement suivant:Utiliser même nom pour objet de base de données comme un objet-cadre privé

objc[2472]: Class Property is implemented in both /System/Library/PrivateFrameworks/Notes.framework/Notes and /var/mobile/Applications/B69194FF-448F-48AD-A78D-DDB8935F/AmcCalc.app/AmcCalc. One of the two will be used. Which one is undefined. 

Quand je commencé à travailler sur cette application Retour avec SDK 3.0 Je n'ai pas eu cette erreur, alors comment faire face à cela?

Merci! Bjorn

Répondre

2

Ceci est une collision de nommage.

La flexibilité fournie par la liaison d'exécution nécessite un espace de nom global. Cela signifie que le nom de n'importe quel symbole dans l'application peut entrer en collision avec n'importe quel autre symbole. Le symbole des attributs de classe inclut la classe dans leur nom interne, de sorte qu'ils entrent rarement en collision. Plus souvent vous avez deux classes avec le même nom.

Dans ce cas, vous avez une classe dans la source de l'application avec le même nom qu'une classe dans l'infrastructure Notes. Il s'agit probablement d'une classe nommée "Property" si je me souviens correctement du format de l'erreur. (Vous pourriez également dire que vous avez une propriété d'une classe qui est définie deux fois.)

Comme bonne pratique, vous devriez nommer vos classes avec un suffixe ou un préfixe unique à votre entreprise ou personne. Par exemple, si vous libérez un logiciel sous Bjorn Geez Software, vous pouvez utiliser "BGS". Alors:

@interface PropertyBGS : ...//new style 
@interface BGSProperty : ...//old style 

Mieux encore, faites vos noms de classe plus descriptive et éviter les noms qui sont liés à des mots réservés ou terminologie commune programmation. Par exemple, si vous écriviez une application immobilière, vous seriez tenté d'utiliser "Property" comme nom de classe pour modéliser un bâtiment réel, mais "property" s'afficherait lui-même dans le code. nom plus unique et descriptif tel que:

@interface RealEstatePropertyBGS : ...//new style 
@interface BGSRealEstateProperty : ...//old style 

Cela empêche non seulement les collisions de noms, mais rend le code plus lisible et auto-documenté.

Questions connexes