2010-09-16 114 views
0

我需要創建一個類,獲取委託進行一些計算,然後調用委託。目標C - 授權問題?

  • 我在哪裏發佈我分配的對象?
  • 是否可以在不分配它的情況下初始化MyClass對象 ,因此 這種方式我不必釋放它。
  • 什麼是做這種 事情的最佳做法? (我試圖創建一個 網絡服務類,它讀取數據, ,一旦完成,它會發送 將數據返回給代理,並且它會破壞數據本身)? (void)viewDidLoad {MyClass * class = [[MyClass alloc] initWithDelegate:self];}}} }

    - (空)MyClassRespond:(NSData的*)數據{// 使用數據和填充屏幕 }

回答

1

類不能破壞本身,你不能初始化一個類對象沒有分配它(其中一個問題是在哪裏確實做的字段存儲沒有一些東西

我不知道爲什麼它需要破壞自己,但通常的方法來做到這一點將是有一個在類中使用viewDidLoad方法創建類型爲MyClass * _class的變量,然後執行相應的操作

-(void)viewDidLoad { _class = [[MyClass alloc] initWithDelegate:self]; } 

-(void) MyClassRespond :(NSData*)data { 
     [_class release]; 
     //use data and populate on screen } 

你當然也可以做,你通過MyClass的回委託方法的東西,所以像

-(void)viewDidLoad {MyClass *class = [[MyClass alloc] initWithDelegate:self]; } 

-(void) MyClassRespond :(NSData*)data fromClass: (MyClass*)class { 
     [class release]; 
     //use data and populate on screen } 

在這種情況下,您的代理會叫MyClassResponds作爲

[delegate MyClassRespond:data fromClass:self]; 

嘗試使MyClass可重用也是有意義的,因此您不需要儘快處理它,但我知道有些情況下這不起作用。

+0

我希望它自己銷燬,所以我不必在我的viewController中創建一個變量。這個類幾乎用於每個viewController從我的服務器檢索數據 – aryaxt 2010-09-16 00:46:42

+0

好吧,所以我的第二個解決方案應該爲你解決這個問題,或者你出於某種原因不喜歡那個? – 2010-09-16 19:06:51

1

讓我們暫時假設你的委託是Foo的實例,調用委託的對象是MyClass。您delegate財產上MyClass應該是這個樣子:

@property (assign) id delegate; 
當然

,你可能會想delegate以符合某種形式的協議,從而爲你的願望使用id<...>語法。代表應該始終分配。如果你保留,你可以進入一些奇怪的循環問題,你會想要避免。因此,您在適當的時候發佈。無論你在哪裏釋放該Foo實例。理想情況下,無論如何,您都會在Foo dealloc方法中發佈MyClass實例,因此您不會泄漏,並且沒有任何對象可以致電該代理。

0

以下工作對我來說,我只是將對象傳遞給我的委託方法,然後在那裏釋放它。這正是NSUrlConnection和其他類的工作原理,所以我認爲這是正確的方式。

-(void)viewDidLoad 
{ 
    MyClass *class = [[MyClass alloc] initWithDelegate:self]; 
} 

-(void) MyClassRespond :(MyClass*)myClass 
{ 
    NSData *myData = myClass.data; 
    [myClass release]; 
}