2012-07-02 85 views
3

我有一個類與特定的格式進行轉換不大一樣的NSDate到的NSString等我應該在塊中使用「self」來訪問類方法嗎?

每個方法都是類方法,如+[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關鍵字,甚至當我可以使用類方法時 - 在這個例子中,我可以因爲我處於同一個類並引用一個類級別的方法 - 因爲它看起來更有意義,如果必須修改我的班級名稱。

那麼這樣寫是否正確?它工作但不是真的正確嗎?我真的需要用[FileManager logUploadOk:s]撥打logUploadOk嗎?

謝謝!

回答

3

不需要使用__block__weak或類似的東西。你正在談論的是類方法中的self,它是類對象本身。類對象爲整個程序而存在,所以像保留和釋放這樣的內存管理不起作用。所以你不必擔心保留週期。

-1

這是不必要的,因爲您使用的是類方法,而不是實例方法。要調用類方法,請使用類名稱:[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

+0

是的,的確,這可能很有趣!我總是忘記類別......關於我的問題:我知道如何調用類方法,但是當我從同一個類的另一個類方法調用它時,我更喜歡使用[self方法]。它會在一個區塊中工作嗎? – dvkch

+0

我不認爲這會起作用,因爲自我指的是實例。你總是可以使用'+ [[self class] someClassMethod];'但我建議遵循一般指導原則。 –

+0

它的工作原理,我想知道它是否可以使用它。所以謝謝,它似乎不是 – dvkch

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

不正確;然而'[[self class] B]'會起作用。 – trojanfoe

+2

[self B]爲我工作 –

+0

+ [className Class]:無法識別的選擇器發送給[[self class] B]的類。 –

相關問題