阻止vs私有方法?

die*_*dez 6 private-methods ios objective-c-blocks

使用块在方法中定义私有方法而不是使用真正的私有方法有什么缺点?除了无法从其他地方调用该方法之外还有什么吗?

例:

-(NSDictionary*)serialize
{   
    NSMutableDictionary* serialization = [NSMutableDictionary dictionary];

    TwoArgumentsBlockType serializeItemBlock = ^void(MyItemClass* item, NSString* identifier)
    {       
        if (item)
        {
            // serialization code
        }
    };

    serializeItemBlock(self.someItem1, kSomeIdentifier1);
    serializeItemBlock(self.someItem2, kSomeIdentifier2);
    serializeItemBlock(self.someItem3, kSomeIdentifier3);
    serializeItemBlock(self.someItem4, kSomeIdentifier4);
    serializeItemBlock(self.someItem5, kSomeIdentifier5);
    serializeItemBlock(self.someItem6, kSomeIdentifier6);
    serializeItemBlock(self.someItem7, kSomeIdentifier7);
    serializeItemBlock(self.someItem8, kSomeIdentifier8);
    serializeItemBlock(self.someItem9, kSomeIdentifier9);
    serializeItemBlock(self.someItem10, kSomeIdentifier10);
    serializeItemBlock(self.someItem11, kSomeIdentifier11);

    return serialization;
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*lay 6

我认为最大的三个缺点是:

  1. 正如您所提到的,该块不可重用.
  2. 该块不可测试 - 您无法编写单元测试来验证块是否符合您的想法.
  3. 代码不太可读.当您阅读此方法时,重要的是序列化一系列事物,而不是序列化如何实现的细节.

将此块移动到方法中将解决所有这些问题.如果某个API使用块作为参数进行块回调,则可以始终从方法返回块.


Ric*_*III 1

代码的清晰度很重要。

方法允许您将整个代码段彼此分开封装,并且可以使其更易于阅读。

选择私有方法而不是块的另一个原因是内存管理。这是一个在这里讨论的话题,但足以说明块在内存管理中很奇怪,并且在这方面与任何其他代码结构不同。