我应该在块中使用“self”来访问类方法吗?

时间:2012-07-02 13:52:58

标签: objective-c objective-c-blocks class-method

我有一个类可以执行很少的转换,例如使用特定格式的NSDate转换为NSString等。

每个方法都是类方法,例如+[Tools humanReadableStringForDate:(NSDate*)date];

我有时需要我的方法+[Tools A]来调用我班级的+[Tools B]方法,但是在一个区块内。

我应该创建__block safeSelf = self;还是不必要因为我使用类级方法?

编辑: 这是一个例子,而不是我的实际代码:

@implementation FileManager 

+(void) uploadEveryFile:(void (^)(NSObject*))thingToDo :(NSArray*) fileArray {

    for(NSString *s in fileArray) {
        [[SomeWebAPI uploadFile:s withSuccess:^(NSNumber *responseCode) {
            [self logUploadOk:s];
        }];
    }
}

+(void) logUploadOk:(NSString*)s {
    NSLog(@"File upload ok : %@", s)
}

@end

我认为这会让事情更加清晰。我喜欢使用self关键字,即使我可以使用类方法 - 在这个例子中我可以因为我在同一个类中并引用类级方法 - 因为它似乎更有意义,并且可以提供帮助如果我必须修改我的班级名称。

这样写它是否正确?它工作但不是真的正确吗?我是否真的需要使用logUploadOk致电[FileManager logUploadOk:s]

谢谢!

3 个答案:

答案 0 :(得分:3)

没有必要使用__block__weak或类似的东西。您在类方法中讨论self,它是类对象本身。类对象适用于整个程序,因此内存管理(如保留和释放)不起作用。所以你不必担心保留周期。

答案 1 :(得分:0)

+ (NSString *)A
{
    NSString *something = [Tools B];
    NSString *something = [self B]; // both are same inside class method
}
+ (NSString *)B
{
//..
}

答案 2 :(得分:-1)

这是不必要的,因为你使用的是类方法,而不是实例方法。要调用Class方法,请使用类名:[Tools doThisForMe]

但是,听起来你可以在这种情况下使用Objective-C Categories。它允许您扩展不同的类并使您的代码更具可读性,例如[myNSDate humanReadableString]

在你的情况下,它将遵循:

的NSDate + Human.h

@interface NSDate (Human)
- (NSString *)humanReadableString;
@end

的NSDate + Human.m

@implementation NSDate (Human)
- (NSString *)humanReadableString {
  // do whatever you want.
  // now 'self' refers to the NSDate instance
}

@end