我剛開始學習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]
任何人都可以解釋爲什麼嗎?我的印象是,我是否使用自我。或不,我正在訪問相同的實例屬性並分配值,所以輸出不應該改變。
這是正切的,但是在obj-c中的FYI標準練習是使用小寫字母開始變量名稱,並以大寫字母開始類名稱。所以你的姓名和電子郵件屬性應該是姓名和電子郵件。 – Nick