Well I am working on a non-ARC project, but use Philipp Kyeck's socketio library which is written using ARC. I am using the method explained in this tutorial merge non-ARC project and ARC library.
In my ViewController file I am initializing the socket using
 SockIO *chatSockIO = [[SocketIO alloc] initWithDelegate:self];
and when I need to disconnect, I call
[chatSockIO disconnect];
which results socketIODidDisconnect delegate method to fire.
- (void) socketIODidDisconnect:(SocketIO *)socket{
   [chatSockIO release]; ==> is this call needed?
}
Now my question is about the line [chatSockIO release]. Should we need to release an object which itself is defined in ARC mode, but is used in a non-ARC project?
Now when I tried the release, I got an exception saying
-[SocketIO retain]: message sent to deallocated instance 0x6fec370
but when I commented out that line, I am getting a memory leak and dealloc in my library object not getting called at all
Forget the library I mentioned, crash in my code and leaks.. What is the usual practice when using an object defined using ARC method, in a non-ARC project. Should I only alloc it, or should I alloc and release it after use?
I run zombie instrument on the crash, and this is what it had to say.. It shows the call to alloc and release functions.
#   Address     Category    Event Type  RefCt   Timestamp       Size    Responsible Library     Responsible Caller
0   0x72d5da0   SocketIO    Malloc      1       00:09.700.274   64      MyProject           -[MyViewController sendRequestForSocketIOPush]
1   0x72d5da0   SocketIO    Retain      2       00:09.700.317   0       MyProject           -[SocketIO initWithDelegate:]
2   0x72d5da0   SocketIO    Release     1       00:09.700.320   0       MyProject           -[SocketIO initWithDelegate:]
3   0x72d5da0   SocketIO    Retain      2       00:09.700.440   0       Foundation          -[NSURLConnectionInternal initWithInfo:]
4   0x72d5da0   SocketIO    Retain      3       00:10.413.717   0       Foundation          -[NSURLConnectionInternal _withConnectionAndDelegate:onlyActive:]
5   0x72d5da0   SocketIO    Release     2       00:10.413.761   0       Foundation          -[NSURLConnectionInternalConnection invokeForDelegate:]
6   0x72d5da0   SocketIO    Retain      3       00:10.413.797   0       Foundation          -[NSURLConnectionInternal _withConnectionAndDelegate:onlyActive:]
7   0x72d5da0   SocketIO    Release     2       00:10.413.811   0       Foundation          -[NSURLConnectionInternalConnection invokeForDelegate:]
8   0x72d5da0   SocketIO    Retain      3       00:10.413.816   0       Foundation          -[NSURLConnectionInternal _withConnectionAndDelegate:onlyActive:]
9   0x72d5da0   SocketIO    Release     2       00:10.415.087   0       Foundation          -[NSURLConnectionInternalConnection invokeForDelegate:]
10  0x72d5da0   SocketIO    Retain      3       00:10.415.214   0       Foundation          -[NSURLConnectionInternal _withConnectionAndDelegate:onlyActive:]
11  0x72d5da0   SocketIO    Release     2       00:10.415.216   0       Foundation          -[NSURLConnectionInternalConnection invokeForDelegate:]
12  0x72d5da0   SocketIO    Release     1       00:10.415.275   0       Foundation          -[NSURLConnectionInternalConnection invokeForDelegate:]
13  0x72d5da0   SocketIO    Retain      2       00:10.969.432   0       GraphicsServices    GSEventRunModal
14  0x72d5da0   SocketIO    Release     1       00:10.969.433   0       GraphicsServices    GSEventRunModal
15  0x72d5da0   SocketIO    Retain      2       00:10.969.434   0       GraphicsServices    GSEventRunModal
16  0x72d5da0   SocketIO    Release     1       00:10.969.456   0       GraphicsServices    GSEventRunModal
17  0x72d5da0   SocketIO    Retain      2       00:10.969.459   0       GraphicsServices    GSEventRunModal
18  0x72d5da0   SocketIO    Retain      3       00:10.969.488   0       Foundation          -[NSCFTimer initWithFireDate:interval:target:selector:userInfo:repeats:]
19  0x72d5da0   SocketIO    Release     2       00:10.976.115   0       MyProject           -[SocketIO setTimeout]
20  0x72d5da0   SocketIO    Retain      3       00:10.976.125   0       Foundation          -[NSCFTimer initWithFireDate:interval:target:selector:userInfo:repeats:]
21  0x72d5da0   SocketIO    Release     2       00:10.976.161   0       GraphicsServices    GSEventRunModal
22  0x72d5da0   SocketIO    Retain      3       00:13.935.328   0       GraphicsServices    GSEventRunModal
23  0x72d5da0   SocketIO    Release     2       00:13.935.373   0       MyProject           -[SocketIO setTimeout]
24  0x72d5da0   SocketIO    Retain      3       00:13.935.399   0       Foundation          -[NSCFTimer initWithFireDate:interval:target:selector:userInfo:repeats:]
25  0x72d5da0   SocketIO    Release     2       00:13.935.685   0       MyProject           -[SocketIO onDisconnect]
26  0x72d5da0   SocketIO    Release     1       00:13.935.705   0       MyProject           -[MyViewController socketIODidDisconnect:]
27  0x72d5da0   SocketIO    Release     0       00:13.935.716   0       GraphicsServices    GSEventRunModal
28  0x72d5da0   SocketIO    Zombie      -1      00:13.936.298   0       GraphicsServices    GSEventRunModal
                To answer your question:
If you use an ARC-managed object from non-ARC code, you use it just as you would use a non-ARC object: If you create or retain it, you have to release or autorelease it.
Regarding your issue:
In on of your comments you mentioned that you tried to fix the problem with initializing like this
self.chatSockIO = [[[SocketIO alloc] initWithDelegate:self] autorelease];
and in socketIODidDisconnect 
self.chatSockIO = nil;
That should work fine, provided that the chatSockIO property has retain semantics, and that only one SocketIO object is used at a time. 
The Zombie output gives a hint on what's going wrong:
NSZombie.It could be either something in your code, or an error in one of the libraries you are using. Just a hunch: In SocketIO.m replace these lines in -onDisconnect
if (_webSocket != nil) {
    [_webSocket close];
}
with
if (_webSocket != nil) {
    [_webSocket close];
    _webSocket.delegate = nil;
}
                        This may not solve your problem, but in any case its usually a TERRIBLE idea to release an object in a delegate call - it may get dealloc'd while still doing work, and particularly if the object is under ARC, may not have a dealloc method.
So convert your close delegate call to this:
- (void) socketIODidDisconnect:(SocketIO *)socket
{
   chatSockIO.delegate = nil; // don't want any more messages
   dispatch_async(dispatch_get_main_gueue(), ^{ self.chatSockIO = nil; }); // typed in text editor
   // your question - is the release needed? Well, under virtually every scenario yes, but I don't know this framework
}
Whether this fixes your problem or not, you should be doing the release in this manner - on the main thread AFTER the delegate has returned. If you look at your code, you should do EXACTLY with this ARC class as you would with a normal class. The interoperability is excellent, I used several NON-ARC projects in my ARC app, and others have successfully done the reverse.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With