爲什麼要改變-testMethod
方法中的自我對象?這是非常非法的。
你實際上在做的是設置一個局部變量self
,它作爲參數傳遞給你的方法,並設置爲一個新的值。這意味着你沒有編輯方法的接收器,你只是編輯你的參數。
當你的方法在運行時調用C函數objc_msgSend()
叫做:
// Declaration of objc_msgSend
id objc_msgSend(id receiver, SEL selector, ...);
現在,當你打電話給你的方法...
[myInst testMethod];
...其實這是被稱爲什麼在運行時:
objc_msgSend(myInst, @selector(testMethod));
你已經看到發生了什麼?在你的方法實現中,self
變量被設置爲objc_msgSend
的第一個參數。當你重新分配self
時,你的不是編輯變量myInst
包含的內容,因此你是而不是編輯你通過的原始實例。您只需將myInst
,即self
(本地變量)設置爲您已知的指針。函數的調用者不會注意到這個變化。
比較你的代碼下面的C代碼:
void myFunction(int a) {
a = 3;
}
int b = 2;
myFunction(b);
printf("%d\n", b);
// The variable b still has the original value assigned to it
上面的代碼做同樣的事你做:
// Variation on objc_msgSend
void myMethodWrittenInC(id myInst) {
// Local variable changes, but will not change in the calling code
myInst = nil;
}
MyClass *myObj;
myObj = [[MyClass alloc] init];
myMethodWrittinInC(myObj);
// At this point myObj is not nil
最後,這是你要做的:
- (void)testMethod
{
NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:@"myEncodedObjectKey"];
// You assign the local variable self (passed as an invisible argument
// to your method) to your new instance, but you do not edit the original
// instance self pointed to. The variable currentProfile does not change.
self = (Profile *) [NSKeyedUnarchiver unarchiveObjectWithData:data];
for (int i = 0; i < self.avatar.count; i++)
[self.avatar
replaceObjectAtIndex:i
withObject:[UIImage imageWithData:[self.avatar objectAtIndex:i]]];
if ([[self.avatar objectAtIndex:0] isKindOfClass:[UIImage class]])
NSLog(@"UIImage");//at this moment it's UIImage
}
// (1) Here currentProfile points to an instance of your class
[currentProfile testMethod];
// (2) it calls the method, but the local variable does not change
// and still points to the same instance.
if ([[currentProfile.avatar objectAtIndex:0] isKindOfClass:[NSData class]])
NSLog(@"NSData");//Moment later it is NSData
你真是太棒了!非常感謝,哥們! – 2012-01-13 08:16:15
這是寫在您的個人資料中的內容:「如果您有任何有關編程或請求的問題,請不要猶豫與我聯繫」。我總是有很多關於編碼的問題,比如現在的問題,所以如果你不是在開玩笑,我會打擾你一下。 – 2012-01-13 08:21:52
沒問題。我總是樂於提供幫助 – v1Axvw 2012-01-13 16:57:56