委托方法不会触发(为空)。使用 ARC

Posted

技术标签:

【中文标题】委托方法不会触发(为空)。使用 ARC【英文标题】:Delegate method won't fire (is null). Using ARC 【发布时间】:2011-10-21 16:18:41 【问题描述】:

我无法触发我的委托方法。我有以下代码:

@class Location;
@protocol LocationDelegate
- (void)location:(Location*)location foundLocation:(CLLocation*)location;
- (void)location:(Location*)location failedToLocateUserWithError:(NSError*)error;
@end 

@interface Location : NSObject 
    __unsafe_unretained id <LocationDelegate> delegate;


@property (nonatomic, assign) id <LocationDelegate> delegate;

@end

...
@implementation Location

@synthesize delegate;

- (void)startUpdatingLocation 
    NSLog(@"%@", delegate); // prints '(null)'
    ...



- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
    NSLog(@"%@", delegate); // prints '(null)'
    [delegate location:self foundLocation:newLocation];


@end

以前在其他项目中工作得很好,所以想知道它是否与 ARC 有关?分配Location 的对象确实符合LocationDelegate。我还将代表设置为自我。但是委托方法没有触发,如果我输出它,它就是空的。

谢谢

【问题讨论】:

【参考方案1】:

仅从您在此处粘贴的代码来看,我没有看到任何东西保留了您的委托(保留的引用)。

您粘贴的所有内容都特别表明您正在竭尽全力不让此代码保留委托。

如果这就是您想要的样子,那么您最好确保它已被保留在其他地方 - 否则 ARC 将正确得出结论,由于没有人对委托有强(保留)引用,因此它是安全(且适当)的释放它。

分配Location的对象确实符合LocationDelegate。一世 我还将委托设置为 self。

谁对那个对象有强烈的引用?

【讨论】:

我尝试将其更改为 (nonatomic, strong) 并且没有 unsafe_unretained,但仍然没有。 摆脱 ivar。在您引用委托的行(例如:[delegate location....)上,请改用self.delegate 赋值后,在调试器中添加一个watch,然后你会看到它何时变为nil。 您说您在某个时候分配了委托属性。在该行上放置一个断点。跨过去。然后在调试器中添加一个watch。 在我分配Location的类中,我设置location.delegate = self;【参考方案2】:

无论您在哪里分配Location,您都分配了代理吗? 例如: Location *location = [[Location alloc] init]; location.delegate = self;

【讨论】:

他特别说他是:I am also setting the delegate to self. 尝试在@protocol LocationDelegate 之后添加

以上是关于委托方法不会触发(为空)。使用 ARC的主要内容,如果未能解决你的问题,请参考以下文章

自定义委托方法触发正常,但值不会保留在其他方法中

UITextField 委托方法不会被触发

委托函数 audioPlayerDidFinishPlaying 每次都不会触发

更改 NSFetchedResultsController 的 fetchRequest.predicate 不会触发委托

iOS registerForRemoteNotifications 不会生成错误,但不会触发提供设备令牌的委托 [重复]

在 iOS 应用程序的生命周期中何时触发 ARC? [复制]