diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp
index 5a0142f384b6a7c3bb525186d6fe88b5659182d4..6a81784360a2f59bb6eeeea9b38d0e7f9529d3bd 100644
--- a/src/shared/cplusplus/CheckDeclaration.cpp
+++ b/src/shared/cplusplus/CheckDeclaration.cpp
@@ -700,26 +700,26 @@ bool CheckDeclaration::visit(ObjCPropertyDeclarationAST *ast)
         if (!attrAst)
             continue;
 
-        const char *attrName = spell(attrAst->attribute_identifier_token);
-        if (!strcmp("getter", attrName)) {
+        Identifier *attrId = identifier(attrAst->attribute_identifier_token);
+        if (attrId == control()->objcGetterId()) {
             if (checkPropertyAttribute(attrAst, propAttrs, Getter)) {
                 // TODO: find method declaration for getter
             }
-        } else if (!strcmp("setter", attrName)) {
+        } else if (attrId == control()->objcSetterId()) {
             if (checkPropertyAttribute(attrAst, propAttrs, Setter)) {
                 // TODO: find method declaration for setter
             }
-        } else if (!strcmp("readwrite", attrName)) {
+        } else if (attrId == control()->objcReadwriteId()) {
             checkPropertyAttribute(attrAst, propAttrs, ReadWrite);
-        } else if (!strcmp("readonly", attrName)) {
+        } else if (attrId == control()->objcReadonlyId()) {
             checkPropertyAttribute(attrAst, propAttrs, ReadOnly);
-        } else if (!strcmp("assign", attrName)) {
+        } else if (attrId == control()->objcAssignId()) {
             checkPropertyAttribute(attrAst, propAttrs, Assign);
-        } else if (!strcmp("retain", attrName)) {
+        } else if (attrId == control()->objcRetainId()) {
             checkPropertyAttribute(attrAst, propAttrs, Retain);
-        } else if (!strcmp("copy", attrName)) {
+        } else if (attrId == control()->objcCopyId()) {
             checkPropertyAttribute(attrAst, propAttrs, Copy);
-        } else if (!strcmp("nonatomic", attrName)) {
+        } else if (attrId == control()->objcNonatomicId()) {
             checkPropertyAttribute(attrAst, propAttrs, NonAtomic);
         }
     }
diff --git a/src/shared/cplusplus/Control.cpp b/src/shared/cplusplus/Control.cpp
index 908bded13401914914639d4021e4fc6eee348530..fee0ee3d94200b88ce66f3f65e4312191659d28d 100644
--- a/src/shared/cplusplus/Control.cpp
+++ b/src/shared/cplusplus/Control.cpp
@@ -89,7 +89,16 @@ public:
         : control(control),
           translationUnit(0),
           diagnosticClient(0)
-    { }
+    {
+        objcGetterId = control->findOrInsertIdentifier("getter");
+        objcSetterId = control->findOrInsertIdentifier("setter");
+        objcReadwriteId = control->findOrInsertIdentifier("readwrite");
+        objcReadonlyId = control->findOrInsertIdentifier("readonly");
+        objcAssignId = control->findOrInsertIdentifier("assign");
+        objcRetainId = control->findOrInsertIdentifier("retain");
+        objcCopyId = control->findOrInsertIdentifier("copy");
+        objcNonatomicId = control->findOrInsertIdentifier("nonatomic");
+    }
 
     ~Data()
     {
@@ -577,6 +586,16 @@ public:
     std::vector<ObjCForwardClassDeclaration *> objcForwardClassDeclarations;
     std::vector<ObjCForwardProtocolDeclaration *> objcForwardProtocolDeclarations;
     std::vector<ObjCMethod *> objcMethods;
+
+    // ObjC context keywords:
+    Identifier *objcGetterId;
+    Identifier *objcSetterId;
+    Identifier *objcReadwriteId;
+    Identifier *objcReadonlyId;
+    Identifier *objcAssignId;
+    Identifier *objcRetainId;
+    Identifier *objcCopyId;
+    Identifier *objcNonatomicId;
 };
 
 Control::Control()
@@ -766,4 +785,26 @@ ObjCForwardProtocolDeclaration *Control::newObjCForwardProtocolDeclaration(unsig
 ObjCMethod *Control::newObjCMethod(unsigned sourceLocation, Name *name)
 { return d->newObjCMethod(sourceLocation, name); }
 
+Identifier *Control::objcGetterId() const
+{ return d->objcGetterId; }
+
+Identifier *Control::objcSetterId() const
+{ return d->objcSetterId; }
+
+Identifier *Control::objcReadwriteId() const
+{ return d->objcReadwriteId; }
+
+Identifier *Control::objcReadonlyId() const
+{ return d->objcReadonlyId; }
+
+Identifier *Control::objcAssignId() const
+{ return d->objcAssignId; }
+
+Identifier *Control::objcRetainId() const
+{ return d->objcRetainId; }
+
+Identifier *Control::objcCopyId() const
+{ return d->objcCopyId; }
 
+Identifier *Control::objcNonatomicId() const
+{ return d->objcNonatomicId; }
diff --git a/src/shared/cplusplus/Control.h b/src/shared/cplusplus/Control.h
index 615eab38f891525824da4d5efaf20ca4c4ba29c9..d4db273e4310de975ceff295e2cf18a20a51d7d2 100644
--- a/src/shared/cplusplus/Control.h
+++ b/src/shared/cplusplus/Control.h
@@ -169,6 +169,16 @@ public:
     /// Creates a new Objective-C method symbol.
     ObjCMethod *newObjCMethod(unsigned sourceLocation, Name *name = 0);
 
+    // Objective-C specific context keywords.
+    Identifier *objcGetterId() const;
+    Identifier *objcSetterId() const;
+    Identifier *objcReadwriteId() const;
+    Identifier *objcReadonlyId() const;
+    Identifier *objcAssignId() const;
+    Identifier *objcRetainId() const;
+    Identifier *objcCopyId() const;
+    Identifier *objcNonatomicId() const;
+
     Identifier *findIdentifier(const char *chars, unsigned size) const;
 
     Identifier *findOrInsertIdentifier(const char *chars, unsigned size);