2011-04-06 75 views

回答

1

提供是:(a)類和其超可以重新init「版沒有內存泄漏或資源和(b)你知道你的類和其超init一切都回到他們通過self和不是一些其他物體的參考,那麼是的...

否則事情就會出錯。考慮你的redefine方法;在這個方法的主體self只是一個局部變量,其內容被初始化爲指向某個對象。更改該局部變量中的值不會更改其最初指向的對象,也不會更改指向該對象的任何其他變量的值。例如。考慮變化:

@implementation Q 
{ 
    - (void) redefine 
    { 
     self = [[Q alloc] init]; // changes the *local* self to refer to a new object 
    } 
    ... 
} 

... 
Q *someQ = [[Q alloc] init];  // allocate an object 
[someQ redefine];    // NO effect on someQ, another Q is just created and leaked 

顯然這不會改變someQ,並且您的版本可能不會。你的代碼會有你想要的效果當且僅當你知道init總是返回它傳遞的對象 - 這在Obj-C中是不能保證的。

+0

之前我做self = [self reinit];我可以釋放 - [自我釋放]? – 123hal321 2011-04-06 14:45:18

+0

Nooo!至少據我瞭解您正在嘗試做什麼 - 即重新創建一個* existing *對象,以便所有現有的引用都可以重新初始化。如果你[自我釋放]'然後'[自我重新定義]'你重新啓動一個剛剛釋放的對象 - 一旦你釋放了一個對象,你將無法繼續使用它!事實上,在任何地方做'自我釋放'實際上是自殺的(一個對象正在自殺),並可能導致悲傷。 – CRD 2011-04-08 21:27:52

0

只要init回報self,它一般不會,不會出錯。

但是,您可能希望將初始化拆分爲一些單獨的方法,您可以從initredefine中調用該方法。

0

您需要從-init返回新對象,而不是簡單地爲自己指定一個新值。你必須記得釋放舊的自我,因爲它是由+alloc創建的。除了注意事項外,明確允許從-init返回不同的對象。這就是爲什麼你會看到,當他們寫的東西像這樣的新手被糾正:

// Bad example! Do NOT do this! 
Foo *foo = [Foo alloc]; 
[foo init]; 

這是一個反模式,因爲-init返回它被稱爲在同一個對象所需。這意味着以上可以最終分配foo指向已釋放的對象,而不是指向已初始化的對象。這就是爲什麼你總是看到+alloc`init鏈接在一起,像這樣:

Foo *foo = [[Foo alloc] init]; 

這也是爲什麼你需要調用超級的-init時自行重新分配,因爲它也可能會返回一個不同的對象。

self = [super init];