Objective c 释放参数

Objective c 释放参数,objective-c,memory-management,protocols,Objective C,Memory Management,Protocols,比如说,如果你让学生在其他线程上做一些事情。并且有自己的代表 @protocol XRequestDelegate; @interface XRequest : NSObject { id<XRequestDelegate> delegate; } @property (nonatomic, retain) id<XRequestDelegate> delegate; - (void) doSomething; @end @protocol XReques

比如说,如果你让学生在其他线程上做一些事情。并且有自己的代表

@protocol XRequestDelegate;

@interface XRequest : NSObject {
    id<XRequestDelegate> delegate;
}
@property (nonatomic, retain) id<XRequestDelegate> delegate;

- (void) doSomething;
@end


@protocol XRequestDelegate <NSObject>

- (void)request:(XRequest *)request didFinish:(id)object;
- (void)request:(XRequest *)request didFailWithError:(NSError*)error;

@end
我们分配了一个
XRequest
实例,并最终在方法中发布


我们可以说这是一种错误的内存管理方式吗。我们应该扩展
XRequest
对象的范围吗?

我见过苹果的例子这样做(我相信这是媒体播放器的例子之一),但我认为这是一种错误的内存管理方式。如果引用
XRequest
的类在
XRequest
完成之前被释放,会发生什么情况?如何防止或释放任何进一步的委托调用

您要做的是将请求保留在ivar中,然后删除其委托并释放它,并在finish/fail方法和苹果的状态下将其设置为nil:

您只能释放或自动释放您拥有的对象


我认为在这种情况下,您不会违反该规则,因为您的委托是分配请求的对象。但是,您确实提到了多个线程,最好的做法是每个线程有一个对象(不要在一个线程上分配请求,然后在另一个线程上释放它)。

如您所见,分配和释放对象在同一个线程上。我的意思是,在
doSomething
方法中,将有更多的线程化进程。同时,我将在相同的内存地址释放我自己的对象。分配对象和引用对象是相同的。没有其他选择。此外,我没有任何机会释放我的对象超过我分配(或保留)@Alkimake我看不到您的委托方法正在同一个线程上被调用,因为您没有显示
doSomething
的代码,但是如果是这样的话,那么我认为您很好。在这种情况下,我会将doSomething设置为类方法(+)。否则,您需要实例化一个对象,该对象只会实例化另一个对象。
- (void)doRequest
{
    XRequest *request = [[XRequest alloc] init];
    [request setDelegate:self];
    [request doSomething];
}

- (void)request:(XRequest *)request didFinish:(id)object
{
    // Use object whatever you want
    [request release];
}

- (void)request:(XRequest *)request didFailWithError:(NSError *)error
{
    //Log Error
    [request release];
}