diff --git a/examples/darwin-framework-tool/commands/clusters/ClusterCommandBridge.h b/examples/darwin-framework-tool/commands/clusters/ClusterCommandBridge.h
index 7bf34f1..50b9cfe 100644
--- a/examples/darwin-framework-tool/commands/clusters/ClusterCommandBridge.h
+++ b/examples/darwin-framework-tool/commands/clusters/ClusterCommandBridge.h
@@ -47,22 +47,8 @@
 
     CHIP_ERROR SendCommand(MTRBaseDevice * _Nonnull device, chip::EndpointId endpointId) override
     {
-        chip::TLV::TLVWriter writer;
-        chip::TLV::TLVReader reader;
-
-        mData = static_cast<uint8_t *>(chip::Platform::MemoryCalloc(sizeof(uint8_t), mDataMaxLen));
-        VerifyOrReturnError(mData != nullptr, CHIP_ERROR_NO_MEMORY);
-
-        writer.Init(mData, mDataMaxLen);
-
-        ReturnErrorOnFailure(mPayload.Encode(writer, chip::TLV::AnonymousTag()));
-        reader.Init(mData, writer.GetLengthWritten());
-        ReturnErrorOnFailure(reader.Next());
-
-        id commandFields = NSObjectFromCHIPTLV(&reader);
-        if (commandFields == nil) {
-            return CHIP_ERROR_INTERNAL;
-        }
+        id commandFields;
+        ReturnErrorOnFailure(GetCommandFields(&commandFields));
         return ClusterCommand::SendCommand(device, endpointId, mClusterId, mCommandId, commandFields);
     }
 
@@ -136,6 +122,35 @@
     NSError * _Nullable mError = nil;
 
 private:
+    CHIP_ERROR GetCommandFields(id _Nonnull * _Nonnull outCommandFields)
+    {
+        CHIP_ERROR err = CHIP_NO_ERROR;
+        chip::TLV::TLVWriter writer;
+        chip::TLV::TLVReader reader;
+
+        mData = static_cast<uint8_t *>(chip::Platform::MemoryCalloc(sizeof(uint8_t), mDataMaxLen));
+        VerifyOrExit(mData != nullptr, err = CHIP_ERROR_NO_MEMORY);
+
+        writer.Init(mData, mDataMaxLen);
+
+        err = mPayload.Encode(writer, chip::TLV::AnonymousTag());
+        SuccessOrExit(err);
+
+        reader.Init(mData, writer.GetLengthWritten());
+        err = reader.Next();
+        SuccessOrExit(err);
+
+        *outCommandFields = NSObjectFromCHIPTLV(&reader);
+        VerifyOrDo(nil != *outCommandFields, err = CHIP_ERROR_INTERNAL);
+
+    exit:
+        if (nullptr != mData) {
+            chip::Platform::MemoryFree(mData);
+            mData = nullptr;
+        }
+        return err;
+    }
+
     chip::ClusterId mClusterId;
     chip::CommandId mCommandId;
 
diff --git a/examples/darwin-framework-tool/commands/clusters/WriteAttributeCommandBridge.h b/examples/darwin-framework-tool/commands/clusters/WriteAttributeCommandBridge.h
index 6600304..f274ea2 100644
--- a/examples/darwin-framework-tool/commands/clusters/WriteAttributeCommandBridge.h
+++ b/examples/darwin-framework-tool/commands/clusters/WriteAttributeCommandBridge.h
@@ -49,23 +49,8 @@
 
     CHIP_ERROR SendCommand(MTRBaseDevice * _Nonnull device, chip::EndpointId endpointId) override
     {
-        chip::TLV::TLVWriter writer;
-        chip::TLV::TLVReader reader;
-
-        mData = static_cast<uint8_t *>(chip::Platform::MemoryCalloc(sizeof(uint8_t), mDataMaxLen));
-        VerifyOrReturnError(mData != nullptr, CHIP_ERROR_NO_MEMORY);
-
-        writer.Init(mData, mDataMaxLen);
-
-        ReturnErrorOnFailure(mAttributeValue.Encode(writer, chip::TLV::AnonymousTag()));
-        reader.Init(mData, writer.GetLengthWritten());
-        ReturnErrorOnFailure(reader.Next());
-
-        id value = NSObjectFromCHIPTLV(&reader);
-        if (value == nil) {
-            return CHIP_ERROR_INTERNAL;
-        }
-
+        id value;
+        ReturnErrorOnFailure(GetValue(&value));
         return WriteAttribute::SendCommand(device, endpointId, mClusterId, mAttributeId, value);
     }
 
@@ -122,6 +107,35 @@
     chip::Optional<uint32_t> mDataVersion;
 
 private:
+    CHIP_ERROR GetValue(id _Nonnull * _Nonnull outValue)
+    {
+        CHIP_ERROR err = CHIP_NO_ERROR;
+        chip::TLV::TLVWriter writer;
+        chip::TLV::TLVReader reader;
+
+        mData = static_cast<uint8_t *>(chip::Platform::MemoryCalloc(sizeof(uint8_t), mDataMaxLen));
+        VerifyOrExit(mData != nullptr, err = CHIP_ERROR_NO_MEMORY);
+
+        writer.Init(mData, mDataMaxLen);
+
+        err = mAttributeValue.Encode(writer, chip::TLV::AnonymousTag());
+        SuccessOrExit(err);
+
+        reader.Init(mData, writer.GetLengthWritten());
+        err = reader.Next();
+        SuccessOrExit(err);
+
+        *outValue = NSObjectFromCHIPTLV(&reader);
+        VerifyOrDo(nil != *outValue, err = CHIP_ERROR_INTERNAL);
+
+    exit:
+        if (nullptr != mData) {
+            chip::Platform::MemoryFree(mData);
+            mData = nullptr;
+        }
+        return err;
+    }
+
     chip::ClusterId mClusterId;
     chip::AttributeId mAttributeId;
     CHIP_ERROR mError = CHIP_NO_ERROR;
