2013-11-03 54 views
0

我剛開始學習Objective-C,我對輸出感到困惑。嘗試在實例方法內理解自我與屬性的用法。爲什麼使用self和without self來設置Objective-C實例方法中的屬性會顯示不同的結果?爲什麼使用self和without self設置Objective-C實例方法中的屬性會顯示不同的結果?

我聲明屬性與複製屬性,並假設賦予屬性將是一個副本,而不是直接引用。

#import <Foundation/Foundation.h> 

@interface AddressCard : NSObject 

//using a copy attribute 
@property (copy, nonatomic) NSString *Name, *Email; 

-(void) setName:(NSString *) name andEmail: (NSString *) email; 
-(void) print; 

@end 

在實施的setName實例方法,我使用self.Name和self.Email設置屬性值

@implementation AddressCard 

@synthesize Name; 
@synthesize Email; 

-(void) setName:(NSString *) name andEmail:(NSString *)email 
{ 
    self.Name = name; 
    self.Email = email; 
} 

-(void) print 
{ 
    NSLog(@"Name : %@ , Email: %@", Name, Email); 
} 
@end 

在主程序中,我傳遞的NSMutableString到SETNAME實例方法,然後調用打印,然後修改名稱可變字符串變量並再次調用打印。

#import <Foundation/Foundation.h> 
#import "AddressCard.h" 

int main(int argc, const char * argv[]) 
{ 

    @autoreleasepool { 

     AddressCard *card = [[AddressCard alloc] init]; 

     //declaring local mutable string variables to use them for passing as parameters 
     //to setName instance method 
     NSMutableString *name = [NSMutableString stringWithString: @"John Doe"]; 
     NSMutableString *email = [NSMutableString stringWithString: @"[email protected]"]; 

     //passing the name and email mutables as parameters 
     [card setName: name andEmail: email]; 

     [card print]; 

     //Modifying name variable which previously passed as parameter to setName method 
     [name appendString: @" MODIFIED"]; 

     NSLog(@"Output Should Not Change"); 

     //Print again  
     [card print]; 

    } 
    return 0; 
} 

在主程序中修改名稱可變字符串變量不會影響第二行結果。

名稱:李四,電子郵件:[email protected]

輸出不應該改變

名稱:李四,電子郵件:[email protected]

但是,如果我通過刪除self並直接設置屬性Name和Email來修改setName實例方法,則不會得到相同的輸出。

-(void) setName:(NSString *) name andEmail:(NSString *)email 
{ 
    // self.Name = name 
    Name = name; 
    // self.Email = email; 
    Email = email; 
} 

對主程序中可變名稱變量的修改反映在輸出中。

名稱:李四,電子郵件:[email protected]

輸出不應該改變

名稱:李四改進,電子郵件:[email protected]

任何人都可以解釋爲什麼嗎?我的印象是,我是否使用自我。或不,我正在訪問相同的實例屬性並分配值,所以輸出不應該改變。

+1

這是正切的,但是在obj-c中的FYI標準練習是使用小寫字母開始變量名稱,並以大寫字母開始類名稱。所以你的姓名和電子郵件屬性應該是姓名和電子郵件。 – Nick

回答

1

我的印象是,我是否使用自我。或不,我正在訪問相同的實例屬性並分配值

相同的實例變量是,但不是以相同的方式。通過使用self.name您正在調用setter方法,該方法正在實現您在屬性中指定的copy。相反,通過直接設置實例變量,您不會複製,因此當可變字符串發生更改時,它在任何地方都會改變。

因此,替代在這種情況下使用self.是:

Name = [name copy]; 

因爲這種尊重您的屬性定義說,你要做的。

相關問題