2015-05-25 19 views
4

我剛剛創建的ExtensionNSStringCategory擴展屬性中出現死機的NSString類別

#import "NSString+Name.h" 

@interface NSString(Name) 

@property (nonatomic, retain) NSString *var; 

@end 

內但是當我試圖訪問私有變量類別類的內部應用程序崩潰,並給出了錯誤。

@implementation NSString (Name) 

- (NSString*)newString{ 

    [self setVar:@"Its a new string"]; // Crashes here 

    NSLog(@"name = %@",self.var); 

    return self.var; 
} 

@end 

原因碰撞

無法識別的選擇發送到實例0x1023641c8 2015年5月25日 11:12:49.246土特[710:14433] ***終止應用程序由於未捕獲 異常' NSInvalidArgumentException」的,理由是: ' - [__ NSCFConstantString SETVAR:]:無法識別的選擇發送到 例如0x1023641c8'

如果我能夠分配在變量值那麼爲什麼它說無法識別的選擇

+1

您是否嘗試過使用'[self setvar:@「它是一個新的字符串」];' –

+0

As @Ghanshyam在他的回答中提到您必須訪問 _var = @「它是一個新的字符串」; 這將設置新的字符串成功 – Kamarshad

+0

@Kamarshad我不能夠訪問_var它只允許我self.var – abhishekkharwar

回答

2

有幾個問題與你」重新嘗試去做。

  1. 您不能按常規向屬性添加屬性。

從蘋果公司的[編程與目標C] [1]的文檔:

分類可用於聲明任一實例中的方法或類的方法,但通常不適合用於聲明的附加屬性。

類別可以添加一種稱爲關聯對象的東西,但其主要目的是添加方法。

  • 一個類別實例的方法內的自助是指一個實例變量
  • 一個類別實例的方法(一個與開始 - )上調用實例變量操作方法。在實例方法中,self指的是調用者實例變量,而不是您嘗試訪問的類(或類別屬性)。

    在你的類實例,你會從現有的NSString被調用newString,就像這樣:

    NSString *myString = @"foo"; 
    [myString newString]; 
    

    換句話說,在newString類別擴展在調用它的字符串操作。您可以更改該字符串,或返回不同的結果,但問題是您正在使用不具有此類屬性或方法的NSString。

    這就是爲什麼你看到一個「沒有這樣的選擇的消息,」爲的NSString一無所知你碰巧添加到您的類別無關的特性。

  • 方法與新開始對ARC特定含義。
  • 的另一個問題是,你與「新」開始的方法。 Objective-C有一些特定的命名約定與內存管理策略有關。使用alloc,new,copy或mutableCopy啓動一個方法隱含地告訴ARC你的方法(已經創建並且正在返回一個保留的對象)。您的newString方法未創建對象。

    2

    使用_代替自我它將進入無限循環

    - (NSString*)newString 
    { 
    
        _var = @"Its a new string"; 
        NSLog(@"name = %@",_var); 
    
        return (self.var); 
    } 
    
    +0

    我無法訪問_var它只允許我訪問self.var或[self var] – abhishekkharwar

    +0

    @synthesize var = _var; 試試這一個,然後使用var而不是自己..... –

    +0

    使它在.h中公開定義是否有某種用於在.m中聲明的目的? –

    4

    您應該使用關聯的對象。找到這個工作對我來說下面的代碼:

    .H

    @interface NSString (Name) 
    
    @property (nonatomic, assign)NSString *var; 
    - (NSString*)newString; 
    @end 
    

    .M

    static char const * const Key = "SomeKey"; 
    
    @implementation NSString (Name) 
    
    - (NSString*)newString 
    { 
        self.var = @"Its a new string"; 
        NSLog(@"name = %@",self.var); 
    
        return (self.var); 
    } 
    
    - (void)setVar:(NSString *)aVar { 
        objc_setAssociatedObject(self, Key, aVar, OBJC_ASSOCIATION_ASSIGN); 
    } 
    
    - (NSString*)var { 
        return (NSString*)objc_getAssociatedObject(self, Key); 
    } 
    

    參考hereherehere

    +0

    這是在Apple創建類中添加變量的最佳方式[link](http://ddeville.me/2011/03/add-variables-to-an-existing-class-in-objective-c/) – Rajneesh