2010-09-16 113 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]; 
}