44
55#import " flutter/shell/platform/darwin/common/framework/Headers/FlutterChannels.h"
66
7+ FLUTTER_ASSERT_ARC
8+
79#pragma mark - Basic message channel
810
911static NSString * const kFlutterChannelBuffersChannel = @" dev.flutter/channel-buffers" ;
@@ -51,9 +53,9 @@ + (instancetype)messageChannelWithName:(NSString*)name
5153+ (instancetype )messageChannelWithName : (NSString *)name
5254 binaryMessenger : (NSObject <FlutterBinaryMessenger>*)messenger
5355 codec : (NSObject <FlutterMessageCodec>*)codec {
54- return [[[ FlutterBasicMessageChannel alloc ] initWithName: name
55- binaryMessenger: messenger
56- codec: codec] autorelease ];
56+ return [[FlutterBasicMessageChannel alloc ] initWithName: name
57+ binaryMessenger: messenger
58+ codec: codec];
5759}
5860
5961- (instancetype )initWithName : (NSString *)name
@@ -69,21 +71,13 @@ - (instancetype)initWithName:(NSString*)name
6971 taskQueue : (NSObject <FlutterTaskQueue>*)taskQueue {
7072 self = [super init ];
7173 NSAssert (self, @" Super init cannot be nil" );
72- _name = [name retain ];
73- _messenger = [ messenger retain ] ;
74- _codec = [ codec retain ] ;
75- _taskQueue = [ taskQueue retain ] ;
74+ _name = [name copy ];
75+ _messenger = messenger;
76+ _codec = codec;
77+ _taskQueue = taskQueue;
7678 return self;
7779}
7880
79- - (void )dealloc {
80- [_name release ];
81- [_messenger release ];
82- [_codec release ];
83- [_taskQueue release ];
84- [super dealloc ];
85- }
86-
8781- (void )sendMessage : (id )message {
8882 [_messenger sendOnChannel: _name message: [_codec encode: message]];
8983}
@@ -107,7 +101,10 @@ - (void)setMessageHandler:(FlutterMessageHandler)handler {
107101 }
108102 return ;
109103 }
104+
110105 // Grab reference to avoid retain on self.
106+ // `self` might be released before the block, so the block needs to retain the codec to
107+ // make sure it is not released with `self`
111108 NSObject <FlutterMessageCodec>* codec = _codec;
112109 FlutterBinaryMessageHandler messageHandler = ^(NSData * message, FlutterBinaryReply callback) {
113110 handler ([codec decode: message], ^(id reply) {
@@ -128,26 +125,19 @@ - (void)resizeChannelBuffer:(NSInteger)newSize {
128125// //////////////////////////////////////////////////////////////////////////////
129126@implementation FlutterError
130127+ (instancetype )errorWithCode : (NSString *)code message : (NSString *)message details : (id )details {
131- return [[[ FlutterError alloc ] initWithCode: code message: message details: details] autorelease ];
128+ return [[FlutterError alloc ] initWithCode: code message: message details: details];
132129}
133130
134131- (instancetype )initWithCode : (NSString *)code message : (NSString *)message details : (id )details {
135132 NSAssert (code, @" Code cannot be nil" );
136133 self = [super init ];
137134 NSAssert (self, @" Super init cannot be nil" );
138- _code = [code retain ];
139- _message = [message retain ];
140- _details = [ details retain ] ;
135+ _code = [code copy ];
136+ _message = [message copy ];
137+ _details = details;
141138 return self;
142139}
143140
144- - (void )dealloc {
145- [_code release ];
146- [_message release ];
147- [_details release ];
148- [super dealloc ];
149- }
150-
151141- (BOOL )isEqual : (id )object {
152142 if (self == object) {
153143 return YES ;
@@ -169,24 +159,18 @@ - (NSUInteger)hash {
169159// //////////////////////////////////////////////////////////////////////////////
170160@implementation FlutterMethodCall
171161+ (instancetype )methodCallWithMethodName : (NSString *)method arguments : (id )arguments {
172- return [[[ FlutterMethodCall alloc ] initWithMethodName: method arguments: arguments] autorelease ];
162+ return [[FlutterMethodCall alloc ] initWithMethodName: method arguments: arguments];
173163}
174164
175165- (instancetype )initWithMethodName : (NSString *)method arguments : (id )arguments {
176166 NSAssert (method, @" Method name cannot be nil" );
177167 self = [super init ];
178168 NSAssert (self, @" Super init cannot be nil" );
179- _method = [method retain ];
180- _arguments = [ arguments retain ] ;
169+ _method = [method copy ];
170+ _arguments = arguments;
181171 return self;
182172}
183173
184- - (void )dealloc {
185- [_method release ];
186- [_arguments release ];
187- [super dealloc ];
188- }
189-
190174- (BOOL )isEqual : (id )object {
191175 if (self == object) {
192176 return YES ;
@@ -224,8 +208,7 @@ + (instancetype)methodChannelWithName:(NSString*)name
224208+ (instancetype )methodChannelWithName : (NSString *)name
225209 binaryMessenger : (NSObject <FlutterBinaryMessenger>*)messenger
226210 codec : (NSObject <FlutterMethodCodec>*)codec {
227- return [[[FlutterMethodChannel alloc ] initWithName: name binaryMessenger: messenger
228- codec: codec] autorelease ];
211+ return [[FlutterMethodChannel alloc ] initWithName: name binaryMessenger: messenger codec: codec];
229212}
230213
231214- (instancetype )initWithName : (NSString *)name
@@ -240,21 +223,13 @@ - (instancetype)initWithName:(NSString*)name
240223 taskQueue : (NSObject <FlutterTaskQueue>*)taskQueue {
241224 self = [super init ];
242225 NSAssert (self, @" Super init cannot be nil" );
243- _name = [name retain ];
244- _messenger = [ messenger retain ] ;
245- _codec = [ codec retain ] ;
246- _taskQueue = [ taskQueue retain ] ;
226+ _name = [name copy ];
227+ _messenger = messenger;
228+ _codec = codec;
229+ _taskQueue = taskQueue;
247230 return self;
248231}
249232
250- - (void )dealloc {
251- [_name release ];
252- [_messenger release ];
253- [_codec release ];
254- [_taskQueue release ];
255- [super dealloc ];
256- }
257-
258233- (void )invokeMethod : (NSString *)method arguments : (id )arguments {
259234 FlutterMethodCall* methodCall = [FlutterMethodCall methodCallWithMethodName: method
260235 arguments: arguments];
@@ -285,6 +260,8 @@ - (void)setMethodCallHandler:(FlutterMethodCallHandler)handler {
285260 return ;
286261 }
287262 // Make sure the block captures the codec, not self.
263+ // `self` might be released before the block, so the block needs to retain the codec to
264+ // make sure it is not released with `self`
288265 NSObject <FlutterMethodCodec>* codec = _codec;
289266 FlutterBinaryMessageHandler messageHandler = ^(NSData * message, FlutterBinaryReply callback) {
290267 FlutterMethodCall* call = [codec decodeMethodCall: message];
@@ -328,8 +305,7 @@ + (instancetype)eventChannelWithName:(NSString*)name
328305+ (instancetype )eventChannelWithName : (NSString *)name
329306 binaryMessenger : (NSObject <FlutterBinaryMessenger>*)messenger
330307 codec : (NSObject <FlutterMethodCodec>*)codec {
331- return [[[FlutterEventChannel alloc ] initWithName: name binaryMessenger: messenger
332- codec: codec] autorelease ];
308+ return [[FlutterEventChannel alloc ] initWithName: name binaryMessenger: messenger codec: codec];
333309}
334310
335311- (instancetype )initWithName : (NSString *)name
@@ -344,21 +320,13 @@ - (instancetype)initWithName:(NSString*)name
344320 taskQueue : (NSObject <FlutterTaskQueue>* _Nullable)taskQueue {
345321 self = [super init ];
346322 NSAssert (self, @" Super init cannot be nil" );
347- _name = [name retain ];
348- _messenger = [ messenger retain ] ;
349- _codec = [ codec retain ] ;
350- _taskQueue = [ taskQueue retain ] ;
323+ _name = [name copy ];
324+ _messenger = messenger;
325+ _codec = codec;
326+ _taskQueue = taskQueue;
351327 return self;
352328}
353329
354- - (void )dealloc {
355- [_name release ];
356- [_codec release ];
357- [_messenger release ];
358- [_taskQueue release ];
359- [super dealloc ];
360- }
361-
362330static FlutterBinaryMessengerConnection SetStreamHandlerMessageHandlerOnChannel (
363331 NSObject <FlutterStreamHandler>* handler,
364332 NSString * name,
0 commit comments