On May 20, 2011, at 9:11 AM, Bing Li wrote:
> Dear all,
>
> I am implementing a TCP client to send messages with BSD sockets. A BOOL
> variable, isConnected, is used to detect if the TCP connection is built.
> Since the client must be accessed by multiple threads, a NSLock,
> isConnectedLock is used.
>
> When testing, after invoking the methods, Connect and SendMessage, I release
> the client. However, I got an exception as follows.
>
> **** -[NSLock dealloc]: lock (<NSLock: 0x100614cc0> '(null)') deallocated
> while still in use*
>
> **** Break on _NSLockError() to debug.*
>
> What is the potential problem?
>
> Thanks so much!
> Bing
>
> - (BOOL) Connect
> {
> [isConnectedLock lock];
> if (!isConnected)
> {
> destinationSocket = socket(AF_INET, SOCK_STREAM,
> IPPROTO_TCP);
> if (destinationSocket < 0)
> {
> return NO;
> }
>
> memset(&destinationAddress, 0, sizeof(destinationAddress));
> destinationAddress.sin_family = AF_INET;
> const char *ip = [DestinationIP UTF8String];
> int isAddressValidate = inet_pton(AF_INET, ip,
> &destinationAddress.sin_addr.s_addr);
> if (isAddressValidate == 0)
> {
> return NO;
Here, and at several other places, you are returning without unlocking first.
This is why I recommend wrapping locks in an exception handler, with the lock
being unlocked in the "finally" part of the handler, so that the lock will
always be unlocked, even if you return inside the function/method or an
exception gets thrown. Like this:
[theLock lock];
@try
{
// do stuff here
}
@catch (NSException *e)
{
// maybe do something here, or re-throw the exception
}
@finally
{
[theLock unlock];
}
Nick Zitzmann
<http://www.chronosnet.com/>
_______________________________________________
Cocoa-dev mailing list ([email protected])
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com
This email sent to [email protected]