父类EKCalendarItem数组存储EKEvent、EKReminder实例为何被静默丢弃?
EKCalendarItem数组添加EKEvent/EKReminder实例被静默丢弃的解决办法
我开发了一款日历查看器,希望同时使用日历事件EKEvent和提醒事件EKReminder。二者均为EKCalendarItem的子类,因此我尝试创建[EKCalendarItem]类型数组,向其中添加EKEvent与EKReminder实例,但发现实例被静默丢弃。以下是我在Swift Playground中编写的测试代码:
var superClassArray:[EKCalendarItem] = [] let reminder = EKReminder() print(reminder) let calEvent = EKEvent() print(calEvent) superClassArray.append(reminder) superClassArray.append(calEvent) print(superClassArray)
问题原因
直接通过无参构造器创建的EKEvent和EKReminder实例是无效的——这两个类必须关联到一个有效的EKCalendar对象才能被正常持有和使用。如果未设置calendar属性,这些实例会被系统判定为无效对象,添加到数组后会被自动释放,表现为"静默丢弃"。
解决方案
要创建可正常使用的实例并添加到数组,需按以下步骤操作:
- 初始化
EKEventStore并请求日历、提醒事项的访问权限 - 获取可用的目标日历(如系统默认日历)
- 使用带
EKEventStore参数的构造器创建实例,并关联对应的日历
修正后的测试代码
import EventKit // 初始化事件存储对象 let eventStore = EKEventStore() // 先请求日历权限,再请求提醒事项权限 eventStore.requestAccess(to: .event) { eventGranted, _ in eventStore.requestAccess(to: .reminder) { reminderGranted, _ in // 确保权限都已获取 guard eventGranted, reminderGranted else { return } // 获取默认的事件日历和提醒日历 guard let defaultEventCalendar = eventStore.defaultCalendarForNewEvents, let defaultReminderCalendar = eventStore.defaultCalendarForNewReminders else { return } var superClassArray: [EKCalendarItem] = [] // 创建有效的提醒实例并关联日历 let reminder = EKReminder(eventStore: eventStore) reminder.calendar = defaultReminderCalendar print(reminder) // 创建有效的日历事件实例并关联日历 let calEvent = EKEvent(eventStore: eventStore) calEvent.calendar = defaultEventCalendar print(calEvent) // 添加到数组 superClassArray.append(reminder) superClassArray.append(calEvent) print(superClassArray) } }
补充说明
- 权限请求是必要步骤,没有权限无法访问日历和提醒事项相关的资源
- 关联日历后,实例的内存管理会正常工作,添加到数组后不会被静默释放
- 也可以使用无参构造器创建实例后,手动设置
calendar属性,但推荐使用带EKEventStore参数的构造器,这是EventKit框架的规范用法
内容的提问来源于stack exchange,提问作者benc
相关产品推荐
相关产品推荐

