警告 - 在协议中找不到释放

Sre*_*jit 0 iphone objective-c ios

我创建了一个协议和一个类来使用该协议.

JSTest.h文件=

@protocol JSTestDelegate

@end

@interface JSTest : NSObject {

    id<JSTestDelegate> delegate;
}

@property (nonatomic, retain) id<JSTestDelegate> delegate;

- (id)initWithDelegate:(id<JSTestDelegate>)del;

@end
Run Code Online (Sandbox Code Playgroud)

JSTest.m文件=

#import "JSTest.h"


@implementation JSTest

@synthesize delegate;

- (id)initWithDelegate:(id<JSTestDelegate>)del {

    self = [super init];

    if(self) {

        self.delegate = del;
    }

    return self;
}

- (void)dealloc {

    [delegate release];
    [super dealloc];
}
Run Code Online (Sandbox Code Playgroud)

我的问题是 - 在dealloc方法中,

[delegate release]
Run Code Online (Sandbox Code Playgroud)

给我一个警告

-release not found in protocol(s)
Run Code Online (Sandbox Code Playgroud)

我无法确定原因.我的代码不应该失败,因为委托将永远是NSObject的子类.但是,我遇到了一些错误的警告,我忽略了警告而没有理解出现警告的原因.

pgb*_*pgb 10

有一个NSObject可以继承的协议(参考这里).该协议包含任何基本方法NSObject.

通过使自己的协议符合它,您将能够在-release不收到任何编译器警告的情况下调用.

示例代码:

@protocol JSTestDelegate<NSObject>

@end
Run Code Online (Sandbox Code Playgroud)

  • @wm除了NSObject之外,Cocoa/Objective-C中还有一个重要的基类:NSProxy(它也符合NSObject协议).指定`NSObject <SomeProtocol>*`会不必要地限制NSProxy对象与API一起使用.绝大多数Cocoa API使用`id`,而不是'NSObject*`,当它们表示"任何对象"时.`id <SomeProtocol>`模式只是现有模式的延续. (2认同)