4
4
5
5
#import " flutter/shell/platform/darwin/common/framework/Headers/FlutterChannels.h"
6
6
7
+ FLUTTER_ASSERT_ARC
8
+
7
9
#pragma mark - Basic message channel
8
10
9
11
static NSString * const kFlutterChannelBuffersChannel = @" dev.flutter/channel-buffers" ;
@@ -51,9 +53,9 @@ + (instancetype)messageChannelWithName:(NSString*)name
51
53
+ (instancetype )messageChannelWithName : (NSString *)name
52
54
binaryMessenger : (NSObject <FlutterBinaryMessenger>*)messenger
53
55
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];
57
59
}
58
60
59
61
- (instancetype )initWithName : (NSString *)name
@@ -69,21 +71,13 @@ - (instancetype)initWithName:(NSString*)name
69
71
taskQueue : (NSObject <FlutterTaskQueue>*)taskQueue {
70
72
self = [super init ];
71
73
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;
76
78
return self;
77
79
}
78
80
79
- - (void )dealloc {
80
- [_name release ];
81
- [_messenger release ];
82
- [_codec release ];
83
- [_taskQueue release ];
84
- [super dealloc ];
85
- }
86
-
87
81
- (void )sendMessage : (id )message {
88
82
[_messenger sendOnChannel: _name message: [_codec encode: message]];
89
83
}
@@ -107,7 +101,10 @@ - (void)setMessageHandler:(FlutterMessageHandler)handler {
107
101
}
108
102
return ;
109
103
}
104
+
110
105
// 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`
111
108
NSObject <FlutterMessageCodec>* codec = _codec;
112
109
FlutterBinaryMessageHandler messageHandler = ^(NSData * message, FlutterBinaryReply callback) {
113
110
handler ([codec decode: message], ^(id reply) {
@@ -128,26 +125,19 @@ - (void)resizeChannelBuffer:(NSInteger)newSize {
128
125
// //////////////////////////////////////////////////////////////////////////////
129
126
@implementation FlutterError
130
127
+ (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];
132
129
}
133
130
134
131
- (instancetype )initWithCode : (NSString *)code message : (NSString *)message details : (id )details {
135
132
NSAssert (code, @" Code cannot be nil" );
136
133
self = [super init ];
137
134
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;
141
138
return self;
142
139
}
143
140
144
- - (void )dealloc {
145
- [_code release ];
146
- [_message release ];
147
- [_details release ];
148
- [super dealloc ];
149
- }
150
-
151
141
- (BOOL )isEqual : (id )object {
152
142
if (self == object) {
153
143
return YES ;
@@ -169,24 +159,18 @@ - (NSUInteger)hash {
169
159
// //////////////////////////////////////////////////////////////////////////////
170
160
@implementation FlutterMethodCall
171
161
+ (instancetype )methodCallWithMethodName : (NSString *)method arguments : (id )arguments {
172
- return [[[ FlutterMethodCall alloc ] initWithMethodName: method arguments: arguments] autorelease ];
162
+ return [[FlutterMethodCall alloc ] initWithMethodName: method arguments: arguments];
173
163
}
174
164
175
165
- (instancetype )initWithMethodName : (NSString *)method arguments : (id )arguments {
176
166
NSAssert (method, @" Method name cannot be nil" );
177
167
self = [super init ];
178
168
NSAssert (self, @" Super init cannot be nil" );
179
- _method = [method retain ];
180
- _arguments = [ arguments retain ] ;
169
+ _method = [method copy ];
170
+ _arguments = arguments;
181
171
return self;
182
172
}
183
173
184
- - (void )dealloc {
185
- [_method release ];
186
- [_arguments release ];
187
- [super dealloc ];
188
- }
189
-
190
174
- (BOOL )isEqual : (id )object {
191
175
if (self == object) {
192
176
return YES ;
@@ -224,8 +208,7 @@ + (instancetype)methodChannelWithName:(NSString*)name
224
208
+ (instancetype )methodChannelWithName : (NSString *)name
225
209
binaryMessenger : (NSObject <FlutterBinaryMessenger>*)messenger
226
210
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];
229
212
}
230
213
231
214
- (instancetype )initWithName : (NSString *)name
@@ -240,21 +223,13 @@ - (instancetype)initWithName:(NSString*)name
240
223
taskQueue : (NSObject <FlutterTaskQueue>*)taskQueue {
241
224
self = [super init ];
242
225
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;
247
230
return self;
248
231
}
249
232
250
- - (void )dealloc {
251
- [_name release ];
252
- [_messenger release ];
253
- [_codec release ];
254
- [_taskQueue release ];
255
- [super dealloc ];
256
- }
257
-
258
233
- (void )invokeMethod : (NSString *)method arguments : (id )arguments {
259
234
FlutterMethodCall* methodCall = [FlutterMethodCall methodCallWithMethodName: method
260
235
arguments: arguments];
@@ -285,6 +260,8 @@ - (void)setMethodCallHandler:(FlutterMethodCallHandler)handler {
285
260
return ;
286
261
}
287
262
// 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`
288
265
NSObject <FlutterMethodCodec>* codec = _codec;
289
266
FlutterBinaryMessageHandler messageHandler = ^(NSData * message, FlutterBinaryReply callback) {
290
267
FlutterMethodCall* call = [codec decodeMethodCall: message];
@@ -328,8 +305,7 @@ + (instancetype)eventChannelWithName:(NSString*)name
328
305
+ (instancetype )eventChannelWithName : (NSString *)name
329
306
binaryMessenger : (NSObject <FlutterBinaryMessenger>*)messenger
330
307
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];
333
309
}
334
310
335
311
- (instancetype )initWithName : (NSString *)name
@@ -344,21 +320,13 @@ - (instancetype)initWithName:(NSString*)name
344
320
taskQueue : (NSObject <FlutterTaskQueue>* _Nullable)taskQueue {
345
321
self = [super init ];
346
322
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;
351
327
return self;
352
328
}
353
329
354
- - (void )dealloc {
355
- [_name release ];
356
- [_codec release ];
357
- [_messenger release ];
358
- [_taskQueue release ];
359
- [super dealloc ];
360
- }
361
-
362
330
static FlutterBinaryMessengerConnection SetStreamHandlerMessageHandlerOnChannel (
363
331
NSObject <FlutterStreamHandler>* handler,
364
332
NSString * name,
0 commit comments